sql >> Base de Datos >  >> RDS >> Oracle

Devolver filas de datos de un bloque pl/sql

Un bloque anónimo no puede devolver nada. Puede asignar valores a una variable de enlace, incluido un tipo de colección o un cursor de referencia, dentro del bloque. Pero la colección tendría que definirse, además de declararse, fuera del bloque. Es decir, tendría que ser un tipo que pueda usar en SQL simple, no algo definido en PL/SQL. En este momento, está utilizando un tipo PL/SQL que se define dentro del bloque y una variable que también se declara dentro del bloque, por lo que está fuera del alcance del cliente y tampoco sería un tipo válido fuera de él. . (Tampoco es necesario inicializarlo, pero ese es un problema menor).

Dependiendo de cómo se consumirá realmente, una opción es usar un cursor de referencia, y puede declararlo y mostrarlo a través de SQL*Plus o SQL Developer con la variable y print comandos Por ejemplo:

variable rc sys_refcursor

begin
  open :rc for ( select ... /* your cursor statement */ );
end;
/

print rc

Puede hacer algo similar desde una aplicación cliente, p. tener una función que devuelva un cursor de referencia o un procedimiento con un parámetro de salida que sea un cursor de referencia y vincularlo desde la aplicación. Luego itere sobre el cursor de referencia como un conjunto de resultados. Pero los detalles dependen del idioma que utilice su aplicación.

Otra opción es tener una función canalizada que devuelva un tipo de tabla, nuevamente definida en el nivel de SQL (con create type ) no en PL/SQL, lo que podría consumir menos recursos que una colección que se devuelve de una sola vez.

Pero tendría que preguntarme por qué estás haciendo esto. Usted dijo que "buscar lotes posteriores lleva mucho más tiempo", lo que parece que está utilizando un mecanismo de paginación en su consulta, generando un número de fila y luego seleccionando un rango de 100 dentro de eso. Si su cliente/aplicación desea obtener todas las filas, sería más sencillo tener una única ejecución de consulta pero buscar el conjunto de resultados en lotes.

Desafortunadamente, sin ninguna información sobre la aplicación, esto es solo especulación...