Eu tenho uma função no Oracle que nem eu nem minha equipe escrevemos e é fortemente ofuscada. No entanto, ele possui um parâmetro de saída do cursor. Como posso descobrir o número e os tipos que o cursor contém?
Para um exemplo do que preciso, considere este cursor:
DECLARE
TEMP1 VARCHAR2(500);
TEMP2 NUMBER;
TEMP3 RAW(16);
TEMP SYS_REFCURSOR;
PROCEDURE MAKE_TEMP(TEMP_RETURN OUT SYS_REFCURSOR) IS
BEGIN
OPEN TEMP_RETURN FOR SELECT DUMMY, 5, HEXTORAW('111') FROM DUAL;
END;
BEGIN
MAKE_TEMP(TEMP);
LOOP
FETCH TEMP INTO TEMP1, TEMP2, TEMP3;
EXIT WHEN (TEMP%NOTFOUND);
DBMS_OUTPUT.PUT_LINE('1: '||TEMP1);
DBMS_OUTPUT.PUT_LINE('2: '||TO_CHAR(TEMP2));
DBMS_OUTPUT.PUT_LINE('3: '||RAWTOHEX(TEMP3));
END LOOP;
CLOSE TEMP;
END;
/
Se MAKE_TEMP
fosse a função que estou tentando usar, precisaria saber que ela tem 3 valores por linha e que os valores são a VARCHAR2
, a NUMBER
e a RAW
nessa ordem para que eu possa definir variáveis para armazenar os resultados.
Estou usando o Oracle 11.2.0.1.0, embora eu agradeça se também existam respostas para versões mais recentes.
Por que não posso simplesmente olhar para a fonte
Se você precisa saber, a função faz parte do Oracle ASP.NET Membership Provider e foi escrita pela Oracle. Estou tentando depurar um problema e gostaria de ver o que esta função está retornando. O código-fonte da função começa assim:
create or replace
FUNCTION "ORA_ASPNET_MEM_GETALLUSERS" wrapped
0
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
3
8
9200000
1
4
0
33
Como você pode ver, será (na melhor das hipóteses) extremamente difícil extrair qualquer informação sobre o cursor disso.
Este código de exemplo mostra como analisar um arquivo
ref_cursor
. Existem colunas adicionais disponíveis, consulte a definição deSYS.DBMS_SQL.desc_tab2
para obter uma lista completa de colunas disponíveis.Neste exemplo, my
ref_cursor
é definido comoselect * from user_tables
. É claro que você substituiria por conta própriaref_cursor
.