En anonym blokering kan ikke returnere noget. Du kan tildele værdier til en bindevariabel, inklusive en samlingstype eller ref-markør, inde i blokken. Men samlingen skulle defineres såvel som deklareres uden for blokken. Det vil sige, at det skulle være en type, du kan bruge i almindelig SQL, ikke noget, der er defineret i PL/SQL. I øjeblikket bruger du en PL/SQL-type, der er defineret i blokken, og en variabel, der også er deklareret i blokken - så det er uden for klientens omfang, og ville heller ikke være en gyldig type uden for den. . (Det skal heller ikke initialiseres, men det er et mindre problem).
Afhængigt af hvordan det virkelig vil blive forbrugt, er en mulighed at bruge en ref-markør, og du kan erklære og vise det gennem SQL*Plus eller SQL Developer med variable
og print
kommandoer. For eksempel:
variable rc sys_refcursor
begin
open :rc for ( select ... /* your cursor statement */ );
end;
/
print rc
Du kan gøre noget lignende fra en klientapplikation, f.eks. have en funktion, der returnerer en ref-markør eller en procedure med en ud-parameter, der er en ref-markør, og bind den fra applikationen. Gentag derefter over ref-markøren som et resultatsæt. Men detaljerne afhænger af det sprog, din applikation bruger.
En anden mulighed er at have en pipelinet funktion, der returnerer en tabeltype - igen defineret på SQL-niveau (med create type
) ikke i PL/SQL - hvilket måske bruger færre ressourcer end en samling, der returneres på én gang.
Men jeg bliver nødt til at spørge, hvorfor du gør det her. Du sagde "at grave ned for senere batches tager betydeligt mere tid", hvilket lyder som om du bruger en personsøgningsmekanisme i din forespørgsel, genererer et rækkenummer og derefter udvælger et interval på 100 inden for det. Hvis din klient/applikation ønsker at få alle rækkerne, ville det være nemmere at udføre en enkelt forespørgsel, men hent resultatsættet i batches.
Desværre uden nogen information om applikationen er dette kun spekulation...