Nested Cursors in PL/SQL Nested Cursors in PL/SQL oracle oracle

Nested Cursors in PL/SQL


Static cursors can only access static objects. In other words, static cursors work only if all tables and columns are known at compile time.

If you need to access a table whose name will only be known during execution, you'll have to use dynamic SQL. For instance, you could use a REF CURSOR in your case:

DECLARE   var_table_name    VARCHAR2(30);   var_dimension_key VARCHAR2(30);   cur_dimension_key SYS_REFCURSOR;BEGIN   FOR cur_all_dim IN (SELECT table_name                         FROM dba_tables                        WHERE dba_tables.tablespace_name = 'USERS'                          AND dba_tables.owner = 'DWH_CORE'                          AND UPPER(dba_tables.table_name) LIKE ('%DIM%%')                          AND UPPER(dba_tables.table_name) NOT LIKE ('%TEMP%')                          AND UPPER(dba_tables.table_name) NOT LIKE ('%DEBUG%')                          AND UPPER(dba_tables.table_name) NOT LIKE ('%LOG%'))    LOOP            OPEN cur_dimension_key        FOR 'SELECT dimention_key               FROM ' || cur_all_dim.table_name;      LOOP         FETCH cur_dimensions_key INTO var_dimension_key;         EXIT WHEN cur_dimensions_key%NOTFOUND;         dbms_output.put_line(cur_all_dim.table_name);         dbms_output.put_line(var_dimension_key);            END LOOP;      CLOSE cur_dimension_key;   END LOOP;END;


    create or replace PROCEDURE PROC_NESTED_CURSOR     AS     CUR1 SYS_REFCURSOR;    CUR2 SYS_REFCURSOR;    LV_DEPTID NUMBER;    LV_DEPTNAME VARCHAR2(200);    LV_EMPID NUMBER;    LV_FSTNAME VARCHAR2(200);    LV_SALARY NUMBER(8,2);    LV_JOBID VARCHAR2(20);    BEGIN      OPEN CUR1 FOR         select department_id, department_name from departments;      LOOP         FETCH CUR1 INTO LV_DEPTID,LV_DEPTNAME;         EXIT WHEN CUR1%NOTFOUND;            dbms_output.put_line('                                                                                                   ');        dbms_output.put_line('DEPARTMENT ID  '||LV_DEPTID ||'                               '|| 'DEPARTMENT NAME  '||LV_DEPTNAME);        dbms_output.put_line('---------------------------------------------------------------------------------------------------');        dbms_output.put_line(RPAD('EMPLOYEE NUMBER',20)||RPAD('EMPLOYEE NAME',20) ||RPAD('SALARY',20)||RPAD('JOB',20) );          OPEN CUR2 FOR SELECT EMPLOYEE_ID,FIRST_NAME,SALARY,JOB_ID FROM EMPLOYEES WHERE DEPARTMENT_ID = LV_DEPTID;          LOOP             FETCH CUR2 INTO LV_EMPID,LV_FSTNAME,LV_SALARY,LV_JOBID;            EXIT WHEN CUR2%NOTFOUND;             dbms_output.put_line(RPAD( LV_EMPID,20)|| RPAD(LV_FSTNAME,20)||RPAD(LV_SALARY,20)||LV_JOBID);            END LOOP;       END LOOP;     END PROC_NESTED_CURSOR;/**This will print like this:-    Department Number :10               Department Name : XXXX    ________________________________________________________    EMPLOYEE NUMBER    EMPLOYEE NAME      SALARY         JOB    XXXXXX                  XXXXXX                  XXXX            XXXXX    XXXXXX                  XXXXXX                  XXXX            XXXXX    .........**/