I was practising for Dynamic SQL and Procedures in order to implement some scripts for weekly, daily, and monthly dashboards. These dashboards require that we create tables, hence I decided to stick with Dynamic SQL. While practising for these, I am getting some errors, and to simulate the errors, I have created the following tables and copied the procedures.
1. Generating the EMP table
CREATE TABLE EMP
(EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR NUMERIC(4),
HIREDATE DATE,
SAL NUMERIC(7, 2),
COMM NUMERIC(7, 2),
DEPTNO NUMERIC(2));
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, '17-DEC-1980', 800, NULL, 20);
INSERT INTO EMP VALUES
(7499, 'ALLEN', 'SALESMAN', 7698, '20-FEB-1981', 1600, 300, 30);
INSERT INTO EMP VALUES
(7521, 'WARD', 'SALESMAN', 7698, '22-FEB-1981', 1250, 500, 30);
INSERT INTO EMP VALUES
(7566, 'JONES', 'MANAGER', 7839, '2-APR-1981', 2975, NULL, 20);
INSERT INTO EMP VALUES
(7654, 'MARTIN', 'SALESMAN', 7698, '28-SEP-1981', 1250, 1400, 30);
INSERT INTO EMP VALUES
(7698, 'BLAKE', 'MANAGER', 7839, '1-MAY-1981', 2850, NULL, 30);
INSERT INTO EMP VALUES
(7782, 'CLARK', 'MANAGER', 7839, '9-JUN-1981', 2450, NULL, 10);
INSERT INTO EMP VALUES
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, NULL, 20);
INSERT INTO EMP VALUES
(7839, 'KING', 'PRESIDENT', NULL, '17-NOV-1981', 5000, NULL, 10);
INSERT INTO EMP VALUES
(7844, 'TURNER', 'SALESMAN', 7698, '8-SEP-1981', 1500, 0, 30);
INSERT INTO EMP VALUES
(7876, 'ADAMS', 'CLERK', 7788, '12-JAN-1983', 1100, NULL, 20);
INSERT INTO EMP VALUES
(7900, 'JAMES', 'CLERK', 7698, '3-DEC-1981', 950, NULL, 30);
INSERT INTO EMP VALUES
(7902, 'FORD', 'ANALYST', 7566, '3-DEC-1981', 3000, NULL, 20);
INSERT INTO EMP VALUES
(7934, 'MILLER', 'CLERK', 7782, '23-JAN-1982', 1300, NULL, 10);
2. Generating the EmpSalary table
CREATE TABLE empSalary
(ename varchar(20),
salary number
);
INSERT INTO empSalary VALUES ('SMITH', 2000);
INSERT INTO empSalary VALUES ('WARD', 300);
COMMIT;
The following procedure works fine:
---- Formulating a Procedure - Try 1
CREATE OR REPLACE PROCEDURE getData(dataType IN VARCHAR2)
IS
newTbl VARCHAR2(20);
sqlQuery VARCHAR2(100);
empName VARCHAR2(20) := 'SMITH';
BEGIN
IF dataType = 'Weekly' THEN
newTbl := 'empTblWeekly'||TO_CHAR(SYSDATE, 'ddmon');
sqlQuery := 'CREATE TABLE '||newTbl||' as SELECT * FROM emp';
EXECUTE IMMEDIATE sqlQuery;
ELSIF dataType = 'Daily' THEN
newTbl := 'empTblDaily'||TO_CHAR(SYSDATE, 'ddmon');
sqlQuery := 'CREATE TABLE '||newTbl||' as SELECT * FROM empSalary';
EXECUTE IMMEDIATE sqlQuery;
ELSIF dataType = 'Monthly' THEN
newTbl := 'empTblMonthly'||TO_CHAR(SYSDATE, 'ddmon');
sqlQuery := 'CREATE TABLE '||newTbl||' as SELECT * FROM emp WHERE ENAME = ''SMITH''';
EXECUTE IMMEDIATE sqlQuery;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No data found!');
COMMIT;
END;
BEGIN
getData('Monthly');
END;
SELECT *
FROM empTblMonthly21Feb;
The following 2 formulations return errors:
---- Formulating a Procedure - Try 2
CREATE OR REPLACE PROCEDURE getData(dataType IN VARCHAR2)
IS
newTbl VARCHAR2(20);
sqlQuery VARCHAR2(100);
empName VARCHAR2(20) := 'SMITH';
BEGIN
IF dataType = 'Weekly' THEN
newTbl := 'empTblWeekly'||TO_CHAR(SYSDATE, 'ddmon');
sqlQuery := 'CREATE TABLE '||newTbl||' as SELECT * FROM emp';
EXECUTE IMMEDIATE sqlQuery;
ELSIF dataType = 'Daily' THEN
newTbl := 'empTblDaily'||TO_CHAR(SYSDATE, 'ddmon');
sqlQuery := 'CREATE TABLE '||newTbl||' as SELECT * FROM empSalary';
EXECUTE IMMEDIATE sqlQuery;
ELSIF dataType = 'Monthly' THEN
newTbl := 'empTblMonthly'||TO_CHAR(SYSDATE, 'ddmon');
sqlQuery := 'CREATE TABLE '||newTbl||' as SELECT * FROM emp WHERE ENAME = :empName';
EXECUTE IMMEDIATE sqlQuery USING empName;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No data found!');
COMMIT;
END;
BEGIN
getData('Monthly');
END;
SELECT *
FROM empTblMonthly21Feb;
---ORA-01027: bind variables not allowed for data definition operations ORA-06512: at "SYS.GETDATA", line 18 ORA-06512: at line 2
---- Formulating a Procedure - Try 3
CREATE OR REPLACE PROCEDURE getData(dataType IN VARCHAR2)
IS
newTbl VARCHAR2(20);
sqlQuery VARCHAR2(100);
empName VARCHAR2(20) := 'SMITH';
BEGIN
IF dataType = 'Weekly' THEN
newTbl := 'empTblWeekly'||TO_CHAR(SYSDATE, 'ddmon');
sqlQuery := 'CREATE TABLE '||newTbl||' as SELECT * FROM emp';
EXECUTE IMMEDIATE sqlQuery;
ELSIF dataType = 'Daily' THEN
newTbl := 'empTblDaily'||TO_CHAR(SYSDATE, 'ddmon');
sqlQuery := 'CREATE TABLE '||newTbl||' as SELECT * FROM empSalary';
EXECUTE IMMEDIATE sqlQuery;
ELSIF dataType = 'Monthly' THEN
newTbl := 'empTblMonthly'||TO_CHAR(SYSDATE, 'ddmon');
sqlQuery := 'CREATE TABLE '||newTbl||' as SELECT * FROM emp WHERE ENAME ='||empName;
EXECUTE IMMEDIATE sqlQuery;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No data found!');
COMMIT;
END;
BEGIN
getData('Monthly');
END;
SELECT *
FROM empTblMonthly21Feb;
---ORA-00904: "SMITH": invalid identifier ORA-06512: at "SYS.GETDATA", line 18 ORA-06512: at line 2
But I am unable to understand why the errors, because in the 2nd try, I am not using a bind variable for a Table name, and in the 3rd try I am simply concatenating a variable...
Thanks for the assistance...