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

Indsæt DML med bindingsvariabel:BRUGER Klausul af Udfør øjeblikkelig erklæring

Indsæt DML med bindingsvariabel:Hvorfor?

Lad os komme til benet! De to største fordele ved bindevariabler er sikkerhed mod SQL-injektioner og ydeevneforbedring ved at reducere hård parsing. På grund af disse fordele er brugen af ​​bindevariabler i din kode ikke kun foreslået, men også anbefalet.

Vil det ikke være en prikken over i'et, hvis vi kunne finde ud af en måde at bruge Bind Variables med Native Dynamic SQL? Hvis du undrer dig over det, så er du på det rigtige sted, mine kære venner, da vi vil gøre præcis det i denne blog.

Hvad er en bindevariabel?

Vi kan definere bind-variabelen som den variabel, vi opretter i SQL*Plus og derefter referere i PL/SQL. Desuden kan vi erklære en Bind-variabel hvor som helst i værtsmiljøet. Derfor er bindevariabler også kendt som værtsvariable.

Du kan læse mere om bindevariabler i PL/SQL tutorial 6 her.

Hvordan bruger man en bindevariabel med Native Dynamic SQL?

For at bruge bindevariable i dynamisk SQL er vi nødt til at tage hjælp af "Using Clause ” af Udfør øjeblikkelig erklæring.

Hvad er denne brugsklausul om Udfør øjeblikkelig erklæring?

I statisk SQL var vi nødt til at angive værdien for bind-variabelen efter udførelse af PL/SQL-programmet. Mens vi i Dynamic SQL skal nævne værdierne på forhånd for alle bindevariabler. De samme, som bruges i SQL-sætningen, som vi ønsker at udføre dynamisk ved hjælp af Execute Immediate.

For at specificere værdierne for alle bindevariabler bruger vi derfor USING-klausulen i Execute Immediate Statement. Ved at anvende "USING"-sætningen viser vi alle værdierne for hver bindevariabel, der bruges i SQL-sætningen, som vi ønsker at udføre dynamisk.

Nu hvor vi har lært, hvad der er bindevariabler, og lad os tage et eksempel ved at bruge klausul om Udfør øjeblikkelig sætning.

Eksempel på Udfør øjeblikkelig med brug af klausul

Til demonstrationen vil vi indsætte dataene i en tabel. Og til det vil vi bruge Execute Immediate-erklæringen. For at forbedre sikkerheden og ydeevnen vil vi også bruge bind-variablen med Insert DML.

For at gøre det skal vi først bruge en tabel, som vi kan indsætte dataene i. Lad os derfor hurtigt oprette en. Og som altid vil jeg holde koden så enkel som muligt for nem forståelse af konceptet.

Trin 1:Opret en tabel

CREATE TABLE stu_info(
    student_name    VARCHAR2 (20)
);

Trin 2:Forbered DML-sætningen

Det er en god programmeringspraksis at forberede din SQL-sætning, som du ønsker at udføre med execute immediate, på forhånd. På denne måde vil du reducere chancerne for syntaksfejl.

Begrænsning for skrivning af DML til Execute Immediate forbliver den samme som for DDL-sætning. Svarende til DDL-sætning DML-sætning bør ikke afsluttes med semikolon. Derfor, med det i tankerne, lad os skrive INSERT-sætningen.

INSERT INTO stu_info (student_name) VALUES (:stu_name)

I standard INSERT DML skriver vi normalt dataene i parentesen af ​​værdier klausulen. Desuden vil disse data ved udførelse blive indsat i den tilsvarende kolonne. Men som du kan se, har vi her brugt en bind-variabel ":stu_name" i stedet for at hårdkode en specifik værdi til indsættelse i tabellen.

Trin 3:Skriv PL/SQL-koden

Det sidste trin i cyklussen er at køre INSERT DML med bindevariabel ved at anvende USING-sætningen af ​​Execute Immediate Statement of Native Dynamic SQL.

SET SERVEROUTPUT ON;
DECLARE
    sql_smt VARCHAR2 (150);
BEGIN
    sql_smt :=  'INSERT INTO stu_info (student_name) VALUES (:stu_name)';
    EXECUTE IMMEDIATE sql_smt USING 'Steve';
END;
/

Lad os forstå, hvad der vil ske ved udførelse af denne PL/SQL-blok. Når du vil udføre dette program, vil PL/SQL-motoren erstatte denne værdi 'Steve' i stedet for bindevariablen :stu_name og derefter udføre INSERT DML'en, som vil indsætte denne værdi i den nævnte tabel.

Derudover er der et par ting, som du skal passe på, mens du skriver ovenstående PL/SQL-program i din ende.

  1. Sørg for at omslutte INSERT DML eller enhver SQL-sætning, som du ønsker at køre ved hjælp af Execute Immediate i et par med et enkelt anførselstegn. Husk også at afslutte opgavesætningen (linje 5) samt din Execute Immediate-erklæring med et semikolon.
  2. Værdien, du tildeler din bind-variabel gennem USING-udtrykket, skal enten være den samme eller kompatibel med datatypen i kolonnen i tabellen, som du indsætter den i. For eksempel i vores tilfælde indsætter vi navnet 'Steve', som er en tegnstreng, i kolonnen student_name af stu_info-tabellen, som er af Varchar2-datatypen. Tegndatatypen er meget kompatibel med Varchar2-datatypen.

Gennem dette program lærte vi to meget vigtige ting.

  1. Sådan bruger du en INSERT DML med Execute Immediate of Dynamic SQL og
  2. Sådan anvender du USING-sætning til at tildele værdier til den bind-variabel, der bruges i SQL-forespørgslen, som vi ønsker at køre dynamisk.

Derudover skal du sørge for at tjekke videoen, da jeg der har diskuteret, hvordan man håndterer fejlen "ORA-01008:Not All Variables Bound". Jeg vil vædde på, at du ikke vil gå glip af løsningen på denne fejl, da den er meget vigtig fra oracle-databasecertificeringsperspektiv.

Hold dig også opdateret, da vi i næste selvstudie lærer, hvordan man håndterer flere bindevariabler ved at anvende Using-klausulen af ​​execute immediate i Oracle Database.

Håber du har lært noget værdifuldt af denne blog. I mellemtiden, vær venlig at dele det med dine venner på din Facebook, Twitter, WhatsApp eller et hvilket som helst medium, du finder praktisk. Abonner også på min YouTube-kanal for flere hurtige og interessante tutorials. Tak og god dag!


  1. Implementer MySQL relationelle databaser på Ubuntu 12.04 (præcis Pangolin)

  2. Baggrundsprocesser

  3. Design af en database til en online jobportal

  4. Sådan tilføjer du en underformular til en formular i Access 2016