sql >> Database >  >> RDS >> Database

DML invoegen met bindingsvariabele:clausule van uitvoering onmiddellijke verklaring GEBRUIKEN

DML invoegen met bindvariabele:waarom?

Laten we er niet omheen draaien! De twee grootste voordelen van bindvariabelen zijn beveiliging tegen SQL-injecties en prestatieverbetering door harde parsing te verminderen. Vanwege deze voordelen wordt het gebruik van bindvariabelen in uw code niet alleen aanbevolen, maar ook aanbevolen.

Zal het geen kers op de taart zijn als we een manier zouden vinden om Bindvariabelen te gebruiken met Native Dynamic SQL? Als je je dat afvraagt, dan ben je hier aan het juiste adres, want dat gaan we precies doen in deze blog.

Wat is een bindvariabele?

We kunnen bindvariabele definiëren als de variabele die we maken in SQL*Plus en vervolgens verwijzen in PL/SQL. Verder kunnen we overal in de hostomgeving een Bind-variabele declareren. Daarom worden bindvariabelen ook wel hostvariabele genoemd.

U kunt hier meer lezen over bindvariabelen in PL/SQL-zelfstudie 6.

Hoe gebruik je een bindvariabele met Native Dynamic SQL?

Om de bindvariabele in dynamische SQL te gebruiken, moeten we de hulp gebruiken van "Clausule gebruiken ” van Execute Immediate statement.

Wat is deze gebruiksclausule van een onmiddellijke verklaring uitvoeren?

In statische SQL moesten we de waarde voor de bindvariabele specificeren na uitvoering van het PL/SQL-programma. Terwijl we in Dynamic SQL de waarden van tevoren moeten vermelden voor alle bindvariabelen. Dezelfde die worden gebruikt in de SQL-instructie die we dynamisch willen uitvoeren met Execute Immediate.

Om de waarden voor alle bindvariabelen te specificeren, gebruiken we daarom de hulp van de USING-clausule van Execute Immediate Statement. Door de 'USING'-clausule toe te passen, vermelden we alle waarden voor elke bindvariabele die in de SQL-instructie wordt gebruikt en die we dynamisch willen uitvoeren.

Nu we hebben geleerd wat bindvariabelen zijn en Clausule of Execute Immediate-statement gebruiken, laten we een voorbeeld doen.

Voorbeeld van onmiddellijk uitvoeren met gebruik van clausule

Voor de demonstratie zullen we de gegevens in een tabel invoegen. En daarvoor gebruiken we de instructie Execute Immediate. Om de beveiliging en de prestaties te verbeteren, zullen we ook de bindvariabele gebruiken met de Insert DML.

Om dat te doen, hebben we eerst een tabel nodig waarin we de gegevens kunnen invoegen. Laten we er daarom snel een maken. En zoals altijd zal ik de code zo eenvoudig mogelijk houden om het concept gemakkelijk te begrijpen.

Stap 1:Maak een tafel

CREATE TABLE stu_info(
    student_name    VARCHAR2 (20)
);

Stap 2:bereid het DML-statement voor

Het is een goede programmeerpraktijk om uw SQL-instructie, die u wilt uitvoeren, vooraf voor te bereiden met behulp van execute onmiddellijk. Op deze manier verkleint u de kans op syntaxisfouten.

De beperking voor het schrijven van DML voor Execute Immediate blijft hetzelfde als die voor DDL-instructie. Net als bij DDL-instructie DML-instructie mag niet worden afgesloten met een puntkomma. Laten we daarom, rekening houdend met dat, het INSERT-statement schrijven.

INSERT INTO stu_info (student_name) VALUES (:stu_name)

In de standaard INSERT DML schrijven we de gegevens meestal tussen de clausule tussen haakjes. Bovendien worden deze gegevens bij uitvoering in de overeenkomstige kolom ingevoegd. Maar zoals je kunt zien, hebben we hier een bindvariabele ":stu_name" gebruikt in plaats van een specifieke waarde hard te coderen om in de tabel in te voegen.

Stap 3:Schrijf de PL/SQL-code

De laatste stap in de cyclus is het uitvoeren van INSERT DML met bindvariabele door de USING-clausule van Execute Immediate Statement of Native Dynamic SQL toe te passen.

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;
/

Laten we begrijpen wat er zal gebeuren bij de uitvoering van dit PL/SQL-blok. Wanneer u dit programma uitvoert, zal de PL/SQL-engine deze waarde 'Steve' vervangen in plaats van bindvariabele :stu_name en vervolgens de INSERT DML uitvoeren die deze waarde in de genoemde tabel zal invoegen.

Verder zijn er een paar dingen die je moet regelen tijdens het schrijven van het bovenstaande PL/SQL-programma aan je einde.

  1. Zorg ervoor dat u de INSERT DML of Any SQL-instructie die u wilt uitvoeren met Execute Immediate in een paar enkele aanhalingstekens plaatst. Vergeet ook niet om de toewijzingsinstructie (regel 5) en uw Execute Immediate-instructie te beëindigen met een puntkomma.
  2. De waarde die u aan uw bindvariabele toewijst via de clausule USING moet hetzelfde zijn of compatibel zijn met het gegevenstype van de kolom van de tabel waarin u deze invoegt. In ons geval voegen we bijvoorbeeld de naam 'Steve', een tekenreeks, in de kolom student_name van stu_info table die van het Varchar2-gegevenstype is. Het karaktergegevenstype is zeer compatibel met het Varchar2-gegevenstype.

Door dit programma hebben we twee zeer belangrijke dingen geleerd.

  1. Een INSERT DML gebruiken met Execute Immediate of Dynamic SQL en
  2. Hoe de USING-clausule toe te passen voor het toewijzen van waarden aan de bindvariabele die wordt gebruikt in de SQL-query die we dynamisch willen uitvoeren.

Zorg er bovendien voor dat u de video bekijkt, want daar heb ik besproken hoe u moet omgaan met de fout "ORA-01008:niet alle variabelen gebonden". Ik wed dat je de oplossing voor deze fout niet wilt missen, omdat het erg belangrijk is vanuit het perspectief van Oracle-databasecertificering.

Blijf ook op de hoogte, want in de volgende zelfstudie zullen we leren omgaan met meerdere bindvariabelen door de gebruiksclausule van execute onmiddellijk toe te passen in Oracle Database.

Ik hoop dat je iets waardevols hebt geleerd van deze blog. Ondertussen, deel het alsjeblieft met je vrienden op je Facebook, Twitter, WhatsApp of elk ander medium dat je handig vindt. Abonneer je ook op mijn YouTube-kanaal voor meer snelle en interessante tutorials. Bedankt en een fijne dag verder!


  1. Wat is het verschil tussen Integrated Security =True en Integrated Security =SSPI?

  2. Sla nieuwe positie van RecyclerView-items op in SQLite nadat ze zijn gesleept en neergezet

  3. Hoe automatisch migraties genereren met Sequelize CLI vanuit Sequelize-modellen?

  4. Dynamisch doorgeven van kolomnamen voor een recordvariabele in PostgreSQL