sql >> Databasteknik >  >> RDS >> Database

Infoga DML med bindningsvariabel:ANVÄNDER Klausul för exekvera omedelbart uttalande

Infoga DML med bindningsvariabel:Varför?

Låt oss ta steget! De två största fördelarna med bindningsvariabler är säkerhet mot SQL-injektioner och prestandaförbättring genom att minska hård analys. På grund av dessa fördelar rekommenderas inte bara användningen av bindningsvariabler i din kod utan också rekommenderas.

Blir det inte en grädde på moset om vi kunde komma på ett sätt att använda Bind Variables med Native Dynamic SQL? Om du undrar så, mina kära vänner, är du på rätt ställe eftersom vi kommer att göra precis det i den här bloggen.

Vad är en bindningsvariabel?

Vi kan definiera bindningsvariabeln som variabeln som vi skapar i SQL*Plus och sedan referera i PL/SQL. Dessutom kan vi deklarera en Bind-variabel var som helst i värdmiljön. Därför är bindningsvariabler också kända som värdvariabler.

Du kan läsa mer om bindningsvariabler i PL/SQL tutorial 6 här.

Hur använder man en bindningsvariabel med Native Dynamic SQL?

För att kunna använda bindvariabel i dynamisk SQL måste vi ta hjälp av "Using Clause ” av Execute Immediate statement.

Vad är det här Using-klausulen för Execute Immediate-intyget?

I statisk SQL var vi tvungna att ange värdet för bindningsvariabel efter exekvering av PL/SQL-programmet. Medan vi i Dynamic SQL måste nämna värdena i förväg för alla bindningsvariabler. Samma som används i SQL-satsen som vi vill köra dynamiskt med Execute Immediate.

För att ange värdena för alla bindningsvariabler tar vi därför hjälp av USING-satsen i Execute Immediate Statement. Genom att använda "USING"-satsen listar vi alla värden för varje bindningsvariabel som används i SQL-satsen som vi vill köra dynamiskt.

Nu när vi har lärt oss vad som är bindningsvariabler, och låt oss ta ett exempel med hjälp av satsen Execute Immediate.

Exempel på exekvera omedelbart med användning av klausul

För demonstrationen kommer vi att infoga data i en tabell. Och för det kommer vi att använda uttalandet Execute Immediate. För att förbättra säkerheten och prestandan kommer vi också att använda bindningsvariabeln med Insert DML.

För att göra det behöver vi först en tabell där vi kan infoga data. Låt oss därför snabbt skapa en. Och som alltid kommer jag att hålla koden så enkel som möjligt för att underlätta förståelsen av konceptet.

Steg 1:Skapa en tabell

CREATE TABLE stu_info(
    student_name    VARCHAR2 (20)
);

Steg 2:Förbered DML-satsen

Det är en bra programmeringspraxis att förbereda din SQL-sats, som du vill köra med execute immediate, i förväg. På så sätt minskar du risken för syntaxfel.

Begränsningen för att skriva DML för Execute Immediate kommer att förbli densamma som för DDL-satsen. Liknar DDL-satsen DML-satsen ska inte avslutas med semikolon. Därför, med det i åtanke, låt oss skriva INSERT-satsen.

INSERT INTO stu_info (student_name) VALUES (:stu_name)

I standarden INSERT DML skriver vi vanligtvis data i parentesen av värden-satsen. Vidare kommer dessa data att infogas i motsvarande kolumn vid körning. Men som du kan se har vi här använt en bindningsvariabel “:stu_name” istället för att hårdkoda något specifikt värde för att infogas i tabellen.

Steg 3:Skriv PL/SQL-koden

Det sista steget i cykeln är att köra INSERT DML med bindningsvariabel genom att använda USING-satsen 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;
/

Låt oss förstå vad som kommer att hända vid exekvering av detta PL/SQL-block. När du kommer att köra det här programmet kommer PL/SQL-motorn att ersätta detta värde 'Steve' istället för bindningsvariabeln :stu_name och sedan köra INSERT DML som kommer att infoga detta värde i den nämnda tabellen.

Dessutom finns det några saker som du måste ta hand om när du skriver ovanstående PL/SQL-program i slutet.

  1. Se till att bifoga INSERT DML eller valfri SQL-sats som du vill köra med Execute Immediate i ett par med enstaka citattecken. Kom också ihåg att avsluta uppdragssatsen (rad 5) samt din Execute Immediate-sats med semikolon.
  2. Värdet du tilldelar din bindningsvariabel genom USING-satsen måste antingen vara samma eller kompatibel med datatypen för kolumnen i tabellen där du infogar den. Till exempel i vårt fall infogar vi namnet 'Steve' som är en teckensträng i kolumnen student_name för stu_info-tabellen som är av Varchar2-datatyp. Teckendatatypen är mycket kompatibel med Varchar2-datatypen.

Genom det här programmet lärde vi oss två mycket viktiga saker.

  1. Hur man använder en INSERT DML med Execute Immediate av Dynamic SQL och
  2. Hur man använder USING-satsen för att tilldela värden till bindningsvariabeln som används i SQL-frågan som vi vill köra dynamiskt.

Se dessutom till att kolla videon eftersom jag har diskuterat hur man hanterar felet "ORA-01008:Not All Variables Bound". Jag slår vad om att du inte vill missa lösningen på det här felet eftersom det är mycket viktigt ur oracles databascertifieringsperspektiv.

Håll också utkik eftersom i nästa handledning kommer vi att lära oss hur man hanterar flera bindningsvariabler genom att använda Using-satsen execute immediate i Oracle Database.

Hoppas du lärde dig något värdefullt från den här bloggen. Under tiden, vänligen dela det med dina vänner på din Facebook, twitter, WhatsApp eller något medium som du tycker är bekvämt. Prenumerera också på min YouTube-kanal för fler snabba och intressanta tutorials. Tack och ha en bra dag!


  1. Hur man skapar en tom databas i Access 2016

  2. Hur kan jag ställa in ett maximalt antal rader i MySQL-tabellen?

  3. Oracle-strängaggregation

  4. SQL Server Internals:Plan Caching Pt. I – Återanvändning av planer