Melhor maneira de usar cursores de pacote PL/SQL do pro*c
-
26-09-2019 - |
Pergunta
Eu tenho um cursor definido em PL/SQL e estou me perguntando qual a melhor maneira de usá -lo do ProC é. Normalmente para um cursor definido no ProC Você faria:
EXEC SQL DECLARE curs CURSOR FOR SELECT 1 FROM DUAL;
EXEC SQL OPEN curs;
EXEC SQL FETCH curs INTO :foo;
EXEC SQL CLOSE cusr;
Eu esperava que a mesma sintaxe (ou similar) funcionasse para um cursor embalado. Por exemplo, eu tenho um pacote mypack, com uma declaração
type MyType is record (X integer);
cursor MyCurs(x in integer) return MyType;
Agora, no meu código profissional, uma peça insatisfatória de PL/SQL incorporado que abre o cursor, faz a busca etc., pois não consegui obter o primeiro estilo de sintaxe a funcionar. Usando o exemplo
EXEC SQL EXECUTE
DECLARE
XTable is table of MyPack.MyType;
BEGIN
OPEN MyPack.MyCurs(:param);
FETCH MyPack.MyCurs INTO XTable;
CLOSE MyPack.MyCurs;
END;
END-EXEC;
Alguém sabe se há uma abordagem mais "pura" pro*c?
Solução
Na verdade, não seria muito diferente do seu primeiro exemplo, apenas verifique se sua definição de cursor está na especificação do pacote e não no corpo da embalagem. Não "declare" e apenas vá com algo como:
Objeto de banco de dados:
create or replace package mypkg as
cursor mycur is
SELECT 1 FROM DUAL;
end;
Em Pro*C:
EXEC SQL OPEN schema.mypkg.mycur;
EXEC SQL FETCH schema.mypkg.mycur INTO :foo;
EXEC SQL CLOSE schema.mypkg.mycur;
Obviamente, o pacote precisaria estar acessível ao usuário do Oracle com o qual você está se conectando, etc. Se o pacote pertence ao usuário que conecta, ou houver um sinônimo de sinônimo, o "esquema". não é necessário nas chamadas pro*c.
Outras dicas
Sim. Faça uma pesquisa no Google no termo ref cursor e você deverá ver exemplos do que deseja fazer.