Database
 sql >> Datenbank >  >> RDS >> Database

DML mit Bind-Variable einfügen:USING-Klausel der Execute Immediate-Anweisung

DML mit Bindungsvariable einfügen:Warum?

Kommen wir zur Sache! Die beiden größten Vorteile von Bind-Variablen sind die Sicherheit gegen SQL-Injektionen und die Leistungssteigerung durch Reduzierung des harten Parsings. Aufgrund dieser Vorteile wird die Verwendung von Bind-Variablen in Ihrem Code nicht nur vorgeschlagen, sondern auch empfohlen.

Wäre es nicht ein Sahnehäubchen, wenn wir einen Weg finden könnten, Bind-Variablen mit nativem dynamischem SQL zu verwenden? Wenn Sie sich das fragen, meine lieben Freunde, dann sind Sie hier genau richtig, denn genau das werden wir in diesem Blog tun.

Was ist eine Bindungsvariable?

Wir können eine Bindevariable als die Variable definieren, die wir in SQL*Plus erstellen und dann in PL/SQL referenzieren. Außerdem können wir überall in der Hostumgebung eine Bind-Variable deklarieren. Daher werden Bind-Variablen auch als Host-Variablen bezeichnet.

Hier können Sie mehr über Bind-Variablen in PL/SQL-Tutorial 6 lesen.

Wie verwende ich eine Bindungsvariable mit Native Dynamic SQL?

Um die Bind-Variable in dynamischem SQL zu verwenden, müssen wir die Hilfe von „Using Clause“ in Anspruch nehmen ” von Execute Immediate Statement.

Was ist diese Using-Klausel der Execute Immediate-Anweisung?

In statischem SQL mussten wir den Wert für die Bind-Variable nach der Ausführung des PL/SQL-Programms angeben. Während wir in Dynamic SQL die Werte für alle Bind-Variablen vorher erwähnen müssen. Die gleichen, die in der SQL-Anweisung verwendet werden, die wir dynamisch mit Execute Immediate ausführen möchten.

Um die Werte für alle Bindungsvariablen anzugeben, nehmen wir daher die Hilfe der USING-Klausel von Execute Immediate Statement. Durch Anwenden der 'USING'-Klausel listen wir alle Werte für jede Bindevariable auf, die in der SQL-Anweisung verwendet wird, die wir dynamisch ausführen möchten.

Nun, da wir gelernt haben, was Bind-Variablen und Using Clause of Execute Immediate Statement sind, machen wir ein Beispiel.

Beispiel für Execute Immediate with Using Clause

Für die Demonstration werden wir die Daten in eine Tabelle einfügen. Und dafür verwenden wir die Execute Immediate-Anweisung. Um die Sicherheit und Leistung zu verbessern, verwenden wir außerdem die Bind-Variable mit der Insert-DML.

Dazu benötigen wir zunächst eine Tabelle, in die wir die Daten einfügen können. Lassen Sie uns daher schnell eine erstellen. Und wie immer werde ich den Code so einfach wie möglich halten, um das Konzept leicht zu verstehen.

Schritt 1:Erstellen Sie eine Tabelle

CREATE TABLE stu_info(
    student_name    VARCHAR2 (20)
);

Schritt 2:Bereiten Sie die DML-Anweisung vor

Es ist eine gute Programmierpraxis, Ihr SQL-Statement, das Sie ausführen möchten, vorher mit Execute Immediate vorzubereiten. Auf diese Weise verringern Sie die Wahrscheinlichkeit von Syntaxfehlern.

Die Einschränkung für das Schreiben von DML für Execute Immediate bleibt die gleiche wie für die DDL-Anweisung. Ähnlich wie bei der DDL-Anweisung sollte die DML-Anweisung nicht mit einem Semikolon abgeschlossen werden. Unter Berücksichtigung dessen schreiben wir daher die INSERT-Anweisung.

INSERT INTO stu_info (student_name) VALUES (:stu_name)

In der Standard-INSERT-DML schreiben wir die Daten normalerweise in die Klammer der Werteklausel. Außerdem werden diese Daten bei der Ausführung in die entsprechende Spalte eingefügt. Aber wie Sie sehen können, haben wir hier eine Bind-Variable „:stu_name“ verwendet, anstatt einen bestimmten Wert zum Einfügen in die Tabelle fest zu codieren.

Schritt 3:Schreiben Sie den PL/SQL-Code

Der letzte Schritt im Zyklus ist die Ausführung von INSERT DML mit Bind-Variablen durch Anwenden der USING-Klausel von 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;
/

Lassen Sie uns verstehen, was bei der Ausführung dieses PL/SQL-Blocks passieren wird. Wenn Sie dieses Programm ausführen, ersetzt die PL/SQL-Engine die Bind-Variable :stu_name durch diesen Wert „Steve“ und führt dann die INSERT-DML aus, die diesen Wert in die erwähnte Tabelle einfügt.

Außerdem gibt es ein paar Dinge, die Sie beim Schreiben des obigen PL/SQL-Programms an Ihrer Seite beachten müssen.

  1. Stellen Sie sicher, dass Sie die INSERT-DML- oder beliebige SQL-Anweisung, die Sie mit Execute Immediate ausführen möchten, in ein Paar einfache Anführungszeichen setzen. Denken Sie auch daran, die Zuweisungsanweisung (Zeile 5) sowie Ihre Execute Immediate-Anweisung mit einem Semikolon zu beenden.
  2. Der Wert, den Sie Ihrer Bind-Variablen über die USING-Klausel zuweisen, muss entweder derselbe oder kompatibel mit dem Datentyp der Spalte der Tabelle sein, in die Sie ihn einfügen. In unserem Fall fügen wir zum Beispiel den Namen „Steve“, der eine Zeichenfolge ist, in die Spalte student_name der Tabelle stu_info ein, die vom Datentyp Varchar2 ist. Der Zeichendatentyp ist sehr kompatibel mit dem Varchar2-Datentyp.

Durch dieses Programm haben wir zwei sehr wichtige Dinge gelernt.

  1. Verwendung einer INSERT-DML mit Execute Immediate of Dynamic SQL und
  2. Anwenden der USING-Klausel zum Zuweisen von Werten zur Bind-Variablen, die in der SQL-Abfrage verwendet wird, die wir dynamisch ausführen möchten.

Sehen Sie sich außerdem unbedingt das Video an, da ich dort besprochen habe, wie mit dem Fehler „ORA-01008:Not All Variables Bound“ umzugehen ist. Ich wette, Sie möchten die Lösung für diesen Fehler nicht verpassen, da sie aus Sicht der Oracle-Datenbankzertifizierung sehr wichtig ist.

Bleiben Sie auch dran, denn im nächsten Tutorial werden wir lernen, wie man mit mehreren Bindungsvariablen umgeht, indem man die Using-Klausel von Execute Instant in Oracle Database anwendet.

Ich hoffe, Sie haben etwas Wertvolles aus diesem Blog gelernt. Teilen Sie es in der Zwischenzeit bitte mit Ihren Freunden auf Facebook, Twitter, WhatsApp oder einem anderen Medium, das Sie für bequem halten. Abonnieren Sie auch meinen YouTube-Kanal für weitere schnelle und interessante Tutorials. Vielen Dank und einen schönen Tag!