sql >> Databasteknik >  >> RDS >> Oracle

Returnera datarader från ett pl/sql-block

En anonym blockering kan inte returnera något. Du kan tilldela värden till en bindningsvariabel, inklusive en samlingstyp eller ref-markör, inuti blocket. Men samlingen skulle behöva definieras, såväl som deklareras, utanför blocket. Det vill säga att det måste vara en typ som du kan använda i vanlig SQL, inte något som definieras i PL/SQL. För tillfället använder du en PL/SQL-typ som är definierad i blocket, och en variabel som deklareras inom blocket också - så det är utanför räckvidd för klienten och skulle inte vara en giltig typ utanför det heller . (Det behöver inte heller initieras, men det är ett mindre problem).

Beroende på hur det verkligen kommer att konsumeras är ett alternativ att använda en ref-markör, och du kan deklarera och visa det genom SQL*Plus eller SQL Developer med variable och print kommandon. Till exempel:

variable rc sys_refcursor

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

print rc

Du kan göra något liknande från en klientapplikation, t.ex. har en funktion som returnerar en ref-markör eller en procedur med en ut-parameter som är en ref-markör, och binder den från applikationen. Iterera sedan över ref-markören som en resultatuppsättning. Men detaljerna beror på vilket språk din applikation använder.

Ett annat alternativ är att ha en pipelined funktion som returnerar en tabelltyp - återigen definierad på SQL-nivå (med create type ) inte i PL/SQL - vilket kan förbruka färre resurser än en samling som returneras på en gång.

Men jag måste ifrågasätta varför du gör det här. Du sa "att gräva ner för senare partier tar betydligt mer tid", vilket låter som att du använder en personsökningsmekanism i din fråga, genererar ett radnummer och väljer sedan ut ett intervall på 100 inom det. Om din klient/applikation vill få alla rader skulle det vara enklare att köra en enda fråga men hämta resultatuppsättningen i omgångar.

Tyvärr utan någon information om applikationen är detta bara spekulationer...



  1. MySQL LIKE med räckvidd fungerar inte

  2. Hitta dubbletter av värden som tilldelats mer än ett unikt värde

  3. SQLT i 12c kan inte samla in statistik

  4. Hur får man de automatiskt genererade ID:n för raden som infogas i tabellen?