Obter o nome das colunas de uma variável SYS_REFCURSOR
Olá Sergio !
Eu vi o seu post no blog mostrando em como se pega as colunas de um SELECT através do pacote DBMS_SQL. Como eu poderia fazer isso recebendo um REFCURSOR ? Fiz várias tentativas e não tive sucesso.
Obrigado de antemão
Daniel R.P. Soares
Daniel,
como combinado, eu prometi que iria responder isso com um pequeno exemplo prático através do meu blog. Então vamos lá !
Abaixo um exemplo de como você poderá fazer isso:
DECLARE
vCount NUMBER DEFAULT 0;
cCursor INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
vDescr DBMS_SQL.DESC_TAB;
vRefCursor SYS_REFCURSOR;
BEGIN
-- Guardar o resultado em uma variável REFCURSOR
OPEN vRefCursor
FOR
SELECT * FROM ALL_TABLES;
-- Abrir o Cursor
cCursor := DBMS_SQL.TO_CURSOR_NUMBER(vRefCursor);
-- Retornar as colunas em um Array
DBMS_SQL.DESCRIBE_COLUMNS
(
cCursor
,vCount
,vDescr
);
-- Ler o Array e exibir os campos
FOR i IN 1..vCount LOOP
DBMS_OUTPUT.PUT_LINE
(
'COLUMN: '|| vDescr(i).col_name
);
END LOOP;
-- Feche sempre o seu cursor ! 🙂
DBMS_SQL.CLOSE_CURSOR
(
cCursor
);
END;
Observe que utilizo o DBMS_SQL.TO_CURSOR_NUMBER para buscar o ID do cursor. Com essa informação em mãos, consigo buscar o resto das informações.
Espero ter ajudado !
Abraço
Excelente amigo! Exatamente o que eu precisava. Porém, tem como fazer algo parecido no Oracle 10g, saberia me informar? Grato.
Como vai Renato ? Tudo bem ?
Rapaz…em 10g o código acima não vai funcionar não. Até onde lembro, no 10g o DBMS_SQL não usava o REFCURSOR. Mas é possível sim, dá uma olhada na doc do DBMS_SQL no 10g:
https://docs.oracle.com/cd/B14117_01/appdev.101/b10802/d_sql.htm#1026121
Eu não tenho um banco 10g aqui para testar. Porém, creio que com a documentação acima, você não terá problemas em montar algo.