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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top