Muito obrigado
De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Enviada em: segunda-feira, 18 de fevereiro de 2019 16:29 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Re: RES: RES: [oracle_b r] Re: Tabela Vári avel 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