Pregunta

Tengo un cursor definido en PL / SQL, y me pregunto cuál es la mejor manera de usarlo desde Pro C es. Normalmente, para un cursor definido en Pro C puede hacer:

EXEC SQL DECLARE curs CURSOR FOR SELECT 1 FROM DUAL;
EXEC SQL OPEN curs;
EXEC SQL FETCH curs INTO :foo;
EXEC SQL CLOSE cusr;

Yo tenía la esperanza de que la misma (o similar) sintaxis sería trabajar para un cursor envasados. Por ejemplo, tengo un MyPack paquete, con una declaración

type MyType is record (X integer);
cursor MyCurs(x in integer) return MyType;

Ahora que tengo en mi código de Pro * C una pieza bastante insatisfactorio de incrustado PL / SQL que se abre el cursor, encargado de recuperar etc., ya que no podía conseguir el primer estilo de sintaxis para el trabajo. Usando el ejemplo

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;

¿Alguien sabe si hay un enfoque * C más "puro" Pro?

¿Fue útil?

Solución

En realidad, no sería muy diferente de su primer ejemplo, sólo asegúrese de que su definición cursor se encuentra en la especificación del paquete y no el cuerpo paquete. No "declarar" y sólo tiene que ir con algo como:

objeto Base de datos:

create or replace package mypkg as 
  cursor mycur is 
    SELECT 1 FROM DUAL; 
end;

En pro * c:

EXEC SQL OPEN schema.mypkg.mycur; 
EXEC SQL FETCH schema.mypkg.mycur INTO :foo; 
EXEC SQL CLOSE schema.mypkg.mycur; 

Por supuesto, el paquete tendría que ser accesible para el usuario de Oracle que se está conectando con, etc. Si el paquete es propiedad del usuario que se conecta, o hay un sinónimo en su lugar, el "esquema". No se requiere en las llamadas pro * c.

Otros consejos

Sí. Haga una búsqueda en Google sobre el término REF CURSOR y debería ver ejemplos de lo que quiere hacer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top