Pra não ficar só no blablablá, eis um exemplo (basicamente COPIADO e COLADO dos 
links que te dei) duma rotina PL/SQL que executa um SQL sem saber nem o npme da 
tabela nem a quantidade de colunas e seus datatypes) - logicamente, aqui eu só 
Exibo via DBMS_OUTPUT, mas vc pode fazer o que bem quiser com os dados qye 
recuperar :

scott@DESENV:SQL>set serveroutput on size 1000000
scott@DESENV:SQL>create or replace procedure PRINT_QUERY_COLUMNS (P_SQL 
varchar2) is
  2    v_SQL VARCHAR2(32767);
  3    v_c  NUMBER;
  4    v_execute    NUMBER;
  5    v_columnCount INTEGER;
  6    v_recTab      DBMS_SQL.DESC_TAB;
  7    v_varcharVal  VARCHAR2(4000);
  8    v_numberVal  NUMBER;
  9    v_dateVal    DATE;
 10    v_ret        NUMBER;  
 11  BEGIN
 12    v_sql := P_SQL; -- Exemplo : 'select * from employees where rownum=1'
 13    v_c := DBMS_SQL.OPEN_CURSOR;
 14    
 15    DBMS_SQL.PARSE(v_c, v_SQL, DBMS_SQL.NATIVE);
 16    
 17    v_execute := DBMS_SQL.EXECUTE(v_c);
 18    
 19    DBMS_SQL.DESCRIBE_COLUMNS(v_c, v_columnCount, v_recTab);
 20    
 21    FOR j in 1..v_columnCount
 22      
 23      LOOP
 24        CASE v_recTab(j).col_type
 25          WHEN 1 THEN DBMS_SQL.DEFINE_COLUMN(v_c,j,v_varcharVal,2000);
 26          WHEN 2 THEN DBMS_SQL.DEFINE_COLUMN(v_c,j,v_numberVal);
 27          WHEN 12 THEN DBMS_SQL.DEFINE_COLUMN(v_c,j,v_dateVal);
 28          ELSE DBMS_SQL.DEFINE_COLUMN(v_c,j,v_varcharVal,2000);
 29        END CASE;
 30      END LOOP;
 31      
 32      LOOP
 33        v_ret := DBMS_SQL.FETCH_ROWS(v_c);
 34      EXIT WHEN v_ret = 0;
 35      
 36      FOR j in 1..v_columnCount
 37        LOOP
 38          CASE v_recTab(j).col_type
 39            WHEN 1 THEN DBMS_SQL.COLUMN_VALUE(v_c, j, v_varcharVal);
 40              DBMS_OUTPUT.PUT_LINE(v_recTab(j).col_type || ' ' ||
 41                        v_recTab(j).col_name || ' ' || v_varcharVal);
 42            WHEN 2 THEN DBMS_SQL.COLUMN_VALUE(v_c,j,v_numberVal);
 43              DBMS_OUTPUT.PUT_LINE(v_recTab(j).col_type || ' ' ||
 44                        v_recTab(j).col_name || ' ' || v_numberVal);
 45            WHEN 12 THEN DBMS_SQL.COLUMN_VALUE(v_c,j,v_dateVal);
 46              DBMS_OUTPUT.PUT_LINE(v_recTab(j).col_type || ' ' ||
 47                        v_recTab(j).col_name || ' ' || v_dateVal);
 48            ELSE
 49              DBMS_OUTPUT.PUT_LINE(v_recTab(j).col_type || ' ' ||
 50                        v_recTab(j).col_name || ' ' || v_varcharVal);
 51          END CASE;
 52        END LOOP;
 53     END LOOP;
 54  END;
 55  /

Procedimento criado.

==> Executo primeiro passando um SELECT numa tabela DEPT :

scott@DESENV:SQL>exec PRINT_QUERY_COLUMNS ('select * from dept');
2 DEPTNO 79
1 DNAME Depto 79
1 LOC
2 TESTE
2 DEPTNO 13
1 DNAME teste=  !!
1 LOC
2 TESTE
2 DEPTNO 10
1 DNAME ACCOUNTING
1 LOC NEW YORK
2 TESTE
2 DEPTNO 20
1 DNAME RESEARCH
1 LOC DALLAS
2 TESTE
2 DEPTNO 30
1 DNAME SALES
1 LOC CHICAGO
2 TESTE
2 DEPTNO 40
1 DNAME OPERATIONS
1 LOC BOSTON
2 TESTE

Procedimento PL/SQL concluído com sucesso.

=> Agora chamo a rotina informando uma query onde informo Apenas Algumas 
colunas da tabela EMP :

scott@DESENV:SQL>exec PRINT_QUERY_COLUMNS ('select empno, ename, sal from emp');
2 EMPNO 7369
1 ENAME SMITH
2 SAL 800
2 EMPNO 7499
1 ENAME ALLEN
2 SAL 1600
2 EMPNO 7521
1 ENAME WARD
2 SAL 1250
2 EMPNO 7566
1 ENAME JONES
2 SAL 2975
2 EMPNO 7654
1 ENAME MARTIN
2 SAL 1250
2 EMPNO 7698
1 ENAME BLAKE
2 SAL 2850
2 EMPNO 7782
1 ENAME CLARK
2 SAL 2450
2 EMPNO 7788
1 ENAME SCOTT
2 SAL 3000
2 EMPNO 7839
1 ENAME KING
2 SAL 5000
2 EMPNO 7844
1 ENAME TURNER
2 SAL 1500
2 EMPNO 7876
1 ENAME ADAMS
2 SAL 1100
2 EMPNO 7900
1 ENAME JAMES
2 SAL 950
2 EMPNO 7902
1 ENAME FORD
2 SAL 3000
2 EMPNO 7934
1 ENAME MILLER
2 SAL 1300

Procedimento PL/SQL concluído com sucesso.

==> Posso INCLUSIVE passar cláusulas de WHERE :

scott@DESENV:SQL>exec PRINT_QUERY_COLUMNS ('select empno, ename, sal from emp 
where sal > 3000');
2 EMPNO 7839
1 ENAME KING
2 SAL 5000

Procedimento PL/SQL concluído com sucesso.

scott@DESENV:SQL>

==> OKDOC ??? mais fácil que isso não fica....

[]s

  Chiappa
  • [oracle_br] Ta... 'Clodoaldo Vilela' clodoaldovil...@yahoo.com.br [oracle_br]
    • [oracle_b... jlchia...@yahoo.com.br [oracle_br]
      • RES: ... 'Clodoaldo Vilela' clodoaldovil...@yahoo.com.br [oracle_br]
        • R... jlchia...@yahoo.com.br [oracle_br]
          • ... 'Clodoaldo Vilela' clodoaldovil...@yahoo.com.br [oracle_br]
            • ... jlchia...@yahoo.com.br [oracle_br]
              • ... jlchia...@yahoo.com.br [oracle_br]
                • ... 'Clodoaldo Vilela' clodoaldovil...@yahoo.com.br [oracle_br]

Responder a