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

Función PIPELINED anidada

Sus funciones están devolviendo data_type_1 , y la colección de tablas también está tratando de consumir eso. Pero ambos necesitan un tipo de colección, incluso si espera que solo devuelvan un valor único (en cuyo caso no tiene mucho sentido canalizar). No puede canalizar un tipo de colección directamente, canaliza un miembro de la colección. Entonces data_type_1 debe ser un tipo escalar u objeto/registro, y necesita otro tipo que sea una colección de esos.

create type data_type_1 as object (x number, y number)
/

create type table_type_1 as table of data_type_1
/

create or replace package xyz AS
  function main_xyz return table_type_1 pipelined;
  function sub_func return table_type_1 pipelined;
  function sub_func1 return table_type_1 pipelined;
end xyz;
/

create or replace package body xyz as
  function main_xyz return table_type_1 pipelined is
  begin 
    --code
    for rec in (select * from table(sub_func)) loop
      pipe row(data_type_1(rec.x, rec.y));
    end loop;
    for rec in (select * from table(sub_func1)) loop
      pipe row(data_type_1(rec.x, rec.y));
    end loop;
  end;

  function sub_func return table_type_1 pipelined is
    def data_type_1;
  begin 
    --code
    pipe row(def); --def is data_type_1
  end sub_func;

  function sub_func1 return table_type_1 pipelined is
    abc data_type_1;
  begin 
    --code
    loop
      pipe row (abc); --abc is data_type_1
    end loop;
  end sub_func1;
end xyz;
/

Así que agregué un tipo de tabla de su data_type_1 existente y cambió las definiciones de función para devolver ese tipo de tabla en su lugar. La pipe row todavía usa data_type_1 - cada uno es una fila en el tipo de tabla. Su ciclo necesita una consulta para su cursor, no una llamada directa a table() , así que he cambiado eso también. Y la fila pipe row(sub_func); también debe ser un bucle similar sobre una consulta.

Solo etiquetó esto como PL/SQL pero porque puede intentar llamar a main_xyz desde SQL simple, y debido a que está llamando a las subfunciones desde un contexto SQL en esos bucles, data_type_1 y table_type_1 debe crearse a nivel de esquema en lugar de en PL/SQL. (Esto ha cambiado un poco en 12c pero no lo suficiente para ayudar aquí).

Si quisiera tenerlos como tipos PL/SQL, declarados en la especificación del paquete, entonces no podría llamar a la función desde un contexto que no sea PL/SQL, y tendría que reemplazar los bucles con una llamada a la función. seguido de una iteración sobre la colección devuelta.