sql >> Database >  >> RDS >> Oracle

Gegevensrijen retourneren uit een pl/sql-blok

Een anonieme blokkering kan niets teruggeven. U kunt waarden toewijzen aan een bindvariabele, inclusief een verzamelingstype of ref-cursor, binnen het blok. Maar de collectie zou zowel buiten het blok moeten worden gedefinieerd als gedeclareerd. Dat wil zeggen, het zou een type moeten zijn dat u in gewone SQL kunt gebruiken, niet iets dat in PL/SQL is gedefinieerd. Op dit moment gebruik je een PL/SQL-type dat is gedefinieerd in het blok, en een variabele die ook binnen het blok is gedeclareerd - dus het valt buiten het bereik van de client en zou ook geen geldig type zijn daarbuiten . (Het hoeft ook niet te worden geïnitialiseerd, maar dat is een klein probleem).

Afhankelijk van hoe het echt zal worden geconsumeerd, is een optie om een ​​ref-cursor te gebruiken, en je kunt dat declareren en weergeven via SQL*Plus of SQL Developer met de variable en print commando's. Bijvoorbeeld:

variable rc sys_refcursor

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

print rc

U kunt iets soortgelijks doen vanuit een clienttoepassing, b.v. een functie hebben die een ref-cursor retourneert of een procedure met een out-parameter die een ref-cursor is, en bind die vanuit de toepassing. Herhaal vervolgens de ref-cursor als een resultaatset. Maar de details zijn afhankelijk van de taal die uw toepassing gebruikt.

Een andere optie is om een ​​pijplijnfunctie te hebben die een tabeltype retourneert - opnieuw gedefinieerd op SQL-niveau (met create type ) niet in PL/SQL - die mogelijk minder bronnen verbruikt dan een verzameling die in één keer wordt geretourneerd.

Maar ik zou me moeten afvragen waarom je dit doet. U zei dat "het zoeken naar latere batches aanzienlijk meer tijd kost", wat klinkt alsof u een paging-mechanisme gebruikt in uw zoekopdracht, een rijnummer genereert en vervolgens een bereik van 100 kiest. Als uw client/toepassing alle rijen wil krijgen, zou het eenvoudiger zijn om een ​​enkele query uit te voeren, maar fetch het resultaat wordt in batches ingesteld.

Helaas zonder enige informatie over de applicatie is dit slechts speculatie...



  1. SQL Server met DateTime als primaire sleutel

  2. een efficiënte manier om te testen of een tabelrij bestaat

  3. Eenvoudigste manier om PHP en MySQL te activeren op Mac OS 10.6 (Snow Leopard), 10.7 (Lion), 10.8 (Mountain Lion)?

  4. De kolom SQL-tijd wordt niet in oplopende volgorde gesorteerd