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

Returner datarækker fra en pl/sql-blok

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...



  1. Fjernelse af dublerede SQL-poster for at tillade en unik nøgle

  2. Opdatering af PHP.ini på et GoDaddy-hostet websted

  3. MySQL ODBC-stik 32bit eller 64bit?

  4. lav tekstkolonne som unik nøgle