sql >> Database teknologi >  >> RDS >> Oracle

Indlejret PIPELINED funktion

Dine funktioner returnerer data_type_1 , og det forsøger bordsamlingen også at forbruge. Men begge har brug for en indsamlingstype, selvom du forventer, at de kun returnerer en enkelt værdi (i så fald er der ikke meget point-pipelining). Du kan ikke sende en indsamlingstype direkte, du sender et medlem af samlingen. Så data_type_1 skal være en skalar- eller objekt-/posttype, og du har brug for en anden type, som er en samling af dem.

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;
/

Så jeg har tilføjet en tabeltype af din eksisterende data_type_1 , og ændrede funktionsdefinitionerne for at returnere denne tabeltype i stedet. pipe row bruger stadig data_type_1 - hver er en række i tabeltypen. Din løkke har brug for en forespørgsel til dens markør, ikke et direkte kald til table() , så det har jeg også ændret. Og pipe row(sub_func); skal også være en lignende løkke over en forespørgsel.

Du har kun tagget dette som PL/SQL, men fordi du måske har til hensigt at kalde main_xyz fra almindelig SQL, og fordi du kalder underfunktionerne fra en SQL-kontekst i disse sløjfer, data_type_1 og table_type_1 skal oprettes på skemaniveau i stedet for i PL/SQL. (Dette har ændret sig en smule i 12c men ikke nok til at hjælpe her).

Hvis du ville have dem som PL/SQL-typer, erklæret i pakkespecifikationen, så kunne du ikke kalde funktionen fra en ikke-PL/SQL-kontekst, og du skulle erstatte sløjferne med et kald til funktionen efterfulgt af en iteration over den returnerede samling.




  1. Sådan importeres en excel-fil til en MySQL-database

  2. Sådan finder du dubletter i MySQL

  3. Postgresql - Hvordan udtrækker jeg den første forekomst af en understreng i en streng ved hjælp af et regulært udtryksmønster?

  4. TSQL:Try-Catch Transaction i Trigger