Udfør øjeblikkeligt med INTO-klausul
Native dynamic SQL eller NDS hjælper udviklere ved at give fleksibilitet, forbedre ydeevnen og forenkle programmeringssyntakser. I dag i denne øvelse skal vi lære, hvordan man skriver en dynamisk SQL-forespørgsel i Oracle Database ved hjælp af Execute Immediate Statement.
Så hvad er en Execute Immediate Statement i Oracle Database?
Ved at bruge Execute Immediate kan vi parse og udføre enhver SQL-sætning eller en PL/SQL-blok dynamisk i Oracle Database. Og med dynamisk mener jeg ved runtime.
Udfør øjeblikkelig tager kun ét argument. Det kan enten være en SQL-sætning eller en PL/SQL-blok. Compiler behandler argumenterne i Execute Immediate-sætningen som strengen af VARCHAR2-datatyper. Sørg derfor for at omslutte din SQL-forespørgsel eller PL/SQL-blok i parret af enkelte anførselstegn ( ' ' ).
Kan vi bruge en hvilken som helst SQL-sætning med Execute Immediate?
Enhver SQL-sætning eller PL/SQL-blok, der returnerer en enkelt række af resultater, kan bruges med Execute Immediate. Hvis dit udsagn giver mere end én række resultater, er der andre måder. Derudover vil vi diskutere disse i fremtidige selvstudier.
Hvad er syntaksen for Udfør øjeblikkelig erklæring?
Syntaks for Udfør øjeblikkelig erklæring er ret enkel. Lad os tage et kig på det.
EXECUTE IMMEDIATE dynamic_query [INTO user_defined_variable-1, user_defined_variable-2…] [USING bind_argument-1, bind_argument-2…] [RETURNING|RETURN-INTO clause];
Hvor:
Udfør øjeblikkeligt :Udfør øjeblikkelig er en reserveret sætning.
Dynamisk_forespørgsel :Efterfulgt af den reserverede sætning skal vi skrive vores dynamiske forespørgsel. Denne forespørgsel kunne være en SQL-sætning eller en PL/SQL-blok. Desuden behandler compileren den dynamiske forespørgsel som en streng af VARCHAR2-datatypen. Derfor skal du sørge for at omslutte din forespørgsel i et par enkelte citater.
INTO-klausul :Ved at bruge INTO-sætningen specificerer vi listen over de brugerdefinerede variabler. Derudover vil disse indeholde værdierne returneret af dynamisk SELECT-sætning. Det minder meget om SELECT-INTO-sætningen. Det er også en valgfri klausul, så hvis du ikke kræver det, kan du udelade det.
USING klausul :Hvis du har brugt en bindingsvariabel i din dynamiske forespørgsel, vil denne klausul gøre dig i stand til at angive værdierne for den bindingsvariabel. Disse vil igen blive erstattet i overensstemmelse hermed i løbet af kørselstiden. Igen er det en valgfri klausul.
RETURNERER eller TILBAGE TIL klausul:Return into klausul er modsat USING klausulen. Mens vi ved at bruge klausul leverer værdierne til den dynamiske forespørgsel her i RETURNING INTO-klausulen, får vi værdierne returneret af den dynamiske forespørgsel. Og gem dem i den specificerede liste over bindeargumenter. Igen er det en valgfri klausul.
Du kan også se den detaljerede forklaring af ovenstående syntaks i den tilsvarende video her.
Eksempel på Udfør øjeblikkelig erklæring.
At lave en demonstration af eksekver med det samme ved hjælp af alle ovennævnte klausuler vil øge kompleksiteten og gøre eksemplet vanskeligt at forstå. Hvilket er præcis det modsatte af, hvad vi ønsker.
For således at holde konceptet enkelt og let at lære, vil vi gøre eksemplet med Execute Immediate ved at bruge den første klausul, som er INTO.
Udfør øjeblikkelig med INTO-klausul.
SET SERVEROUTPUT ON; DECLARE sql_qry VARCHAR2 (150); emp_tot NUMBER(3); BEGIN sql_qry:= ‘SELECT count (*) FROM employees'; EXECUTE IMMEDIATE sql_qry INTO emp_tot; DBMS_OUTPUT.PUT_LINE ('Total employees are: '||emp_tot); END; /
Her er et meget simpelt eksempel, der viser, hvordan man bruger execute immediate med INTO klausul i Oracle Database. Lad os se, hvad vi gjorde her.
Erklæringsafsnit
I deklarationsafsnittet har vi deklareret to variable. Den første variabel er sql_qry af typen VARCHAR 2. Vi vil bruge denne variabel til at gemme SELECT-sætningen, som vi ønsker at udføre med vores EXECUTE IMMEDIATE-sætning. Da denne variabel kommer til at indeholde en DML-sætning, skal vi derfor sikre os, at den har en tilstrækkelig databredde.
Den anden er brugerdefineret variabel emp_tot. Vi vil bruge denne variabel med INTO-sætning til at holde de data, der returneres af vores SELECT-sætning.
Udførelsessektion
I dette afsnit har vi kun tre udsagn. Disse er:
Erklæring 1 :
I den første sætning tildeler vi en gyldig SQL-forespørgsel til variablen sql_qry.
Erklæring 2 :
Den anden sætning er EXECUTE IMMEDIATE – INTO-sætningen. I denne sætning lige efter at have skrevet den reserverede sætning execute immediate skriver vi navnet på variablen sql_qry. Den samme variabel, som vi gemmer SELECT-sætningen i.
Ved udførelse vil runtime-motoren erstatte denne variabel med det indhold, den har, som i vores tilfælde er en SELECT-sætning. Hvis der ikke er nogen fejl, vil runtime-motoren udføre den underliggende SELECT-sætning. Returner derefter resultatet, hvis der er nogen.
I mellemtiden vil vores SELECT-sætning returnere en værdi, som er det samlede antal rækker af medarbejdertabel. Ved at bruge INTO-sætningen af EXECUTE IMMEDIATE-sætningen gemmer vi den returnerende værdi i variablen emp_tot.
Erklæring 3 :
Den tredje sætning er en output-sætning, hvor vi viser værdien af emp_tot-variablen tilbage til brugeren.
Oplysninger:
I tilfælde af DML-transaktion kræves en eksplicit commit, da Execute Immediate ikke automatisk begår en DML-transaktion.
En alternativ måde at skrive denne udførelsessektion på er:
BEGIN EXECUTE IMMEDIATE 'SELECT count (*) FROM employees' INTO emp_tot; DBMS_OUTPUT.PUT_LINE ('Total employees are: '||emp_tot); END; /
Hvis du vil, kan du springe det første udsagn helt over. Bare skriv SQL-forespørgslen direkte efter den reserverede sætning EXECUTE IMMEDIATE.
Se venligst videoen på min YouTube-kanal for at finde ud af, hvad der er den rigtige måde at skrive forespørgslen på til Execute Immediate.
Hvad tænker I?
Personligt kan jeg godt lide den tidligere måde, hvor vi brugte variablen til at gemme forespørgslen. Og senere brugte den variabel med Execute Immediate. For det får vores kode til at se pæn og ren ud. Desuden hjælper det os med at holde styr på vores forespørgsel, hvis vi nogensinde ønsker at ændre eller modificere det.
Hvad synes I? Hvilken måde at skrive Execute Immediate på kan du bedst lide? Førstnævnte eller sidstnævnte. Fortæl mig dine meninger på min Facebook-side eller på min Twitter.
Hvis du synes, det er meget praktisk at lære ved at se videoer, kan du se videoen på min YouTube-kanal. Og lær om Execute Immediate with INTO-klausulen.
Indtil videre har vi i denne øvelse lært, hvad Execute Immediate Statement er, og hvordan man bruger det til at udføre en SQL-forespørgsel dynamisk ved hjælp af INTO-sætning i Oracle Database. Jeg tror, det er nok til denne tutorial. Lad os holde det enkelt ved ikke at strække det yderligere.
Sørg for at abonnere på min YouTube-kanal for flere interessante tutorials.
Tak og god dag!