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

Inserisci DML con la variabile Bind:USING Clause Of Execute Immediate Statement

Inserisci DML con la variabile Bind:perché?

Andiamo al sodo! I due maggiori vantaggi delle variabili di collegamento sono la sicurezza contro le iniezioni SQL e il miglioramento delle prestazioni grazie alla riduzione dell'analisi hardware. A causa di questi vantaggi, l'uso delle variabili di collegamento nel codice non è solo consigliato, ma anche consigliato.

Non sarebbe una ciliegina sulla torta se potessimo trovare un modo per utilizzare le variabili Bind con Native Dynamic SQL? Se ve lo state chiedendo, allora miei cari amici siete nel posto giusto perché faremo esattamente questo in questo blog.

Cos'è una variabile di collegamento?

Possiamo definire la variabile bind come la variabile che creiamo in SQL*Plus e quindi facciamo riferimento in PL/SQL. Inoltre possiamo dichiarare una variabile Bind ovunque nell'ambiente host. Pertanto le variabili bind sono anche conosciute come variabili host.

Puoi leggere di più sulle variabili di binding nel tutorial 6 di PL/SQL qui.

Come utilizzare una variabile di collegamento con Native Dynamic SQL?

Per utilizzare la variabile di collegamento in SQL dinamico, è necessario avvalersi dell'aiuto di "Utilizzo della clausola ” di Esegui istruzione immediata.

Cos'è questa dichiarazione Using Clause of Execute Immediate?

In SQL statico abbiamo dovuto specificare il valore per la variabile bind dopo l'esecuzione del programma PL/SQL. Mentre in Dynamic SQL dobbiamo menzionare in anticipo i valori per tutte le variabili di collegamento. Gli stessi utilizzati nell'istruzione SQL che desideriamo eseguire dinamicamente utilizzando Esegui Immediato.

Pertanto, per specificare i valori per tutte le variabili di binding, prendiamo l'aiuto della clausola USING di Execute Immediate Statement. Applicando la clausola "USING" elenchiamo tutti i valori per ogni variabile di collegamento utilizzata nell'istruzione SQL che desideriamo eseguire in modo dinamico.

Ora che abbiamo imparato cosa sono le variabili bind e l'istruzione Using Clause of Execute Immediate facciamo un esempio.

Esempio di esecuzione immediata con l'utilizzo della clausola

Per la dimostrazione inseriremo i dati in una tabella. E per questo useremo l'istruzione Execute Immediate. Inoltre, per migliorare la sicurezza e le prestazioni, utilizzeremo la variabile bind con Insert DML.

Per fare ciò avremo prima bisogno di una tabella in cui possiamo inserire i dati. Pertanto, creiamone uno rapidamente. E come sempre manterrò il codice il più semplice possibile per una facile comprensione del concetto.

Passaggio 1:crea una tabella

CREATE TABLE stu_info(
    student_name    VARCHAR2 (20)
);

Passaggio 2:prepara la dichiarazione DML

È una buona pratica di programmazione preparare in anticipo la tua istruzione SQL, che desideri eseguire utilizzando esegui immediatamente. In questo modo ridurrai le possibilità di errori di sintassi.

La restrizione per la scrittura di DML per Execute Immediate rimarrà la stessa di quella per l'istruzione DDL. Simile all'istruzione DDL L'istruzione DML non deve terminare con un punto e virgola. Pertanto, tenendo presente ciò, scriviamo la dichiarazione INSERT.

INSERT INTO stu_info (student_name) VALUES (:stu_name)

In INSERT DML standard di solito scriviamo i dati nella parentesi della clausola dei valori. Inoltre, all'esecuzione, questi dati verranno inseriti nella colonna corrispondente. Ma come puoi vedere, qui abbiamo usato una variabile bind “:stu_name” invece di codificare qualsiasi valore specifico da inserire nella tabella.

Fase 3:scrivi il codice PL/SQL

L'ultimo passaggio del ciclo è eseguire INSERT DML con la variabile bind applicando la clausola USING di 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;
/

Capiamo cosa accadrà all'esecuzione di questo blocco PL/SQL. Quando eseguirai questo programma, il motore PL/SQL sostituirà questo valore 'Steve' al posto della variabile bind :stu_name e quindi eseguirà INSERT DML che inserirà questo valore nella tabella menzionata.

Inoltre ci sono alcune cose di cui devi occuparti mentre scrivi il programma PL/SQL sopra alla tua fine.

  1. Assicurati di racchiudere l'istruzione INSERT DML o Any SQL che desideri eseguire utilizzando Execute Immediate in una coppia di virgolette singole. Inoltre, ricorda di terminare l'istruzione di assegnazione (riga 5) e l'istruzione Esegui Immediato con un punto e virgola.
  2. Il valore che stai assegnando alla tua variabile bind tramite la clausola USING deve essere uguale o compatibile con il tipo di dati della colonna della tabella in cui lo stai inserendo. Ad esempio nel nostro caso stiamo inserendo il nome "Steve" che è una stringa di caratteri nella colonna nome_studente della tabella stu_info che è di tipo dati Varchar2. Il tipo di dati del carattere è molto compatibile con il tipo di dati Varchar2.

Attraverso questo programma abbiamo imparato due cose molto importanti.

  1. Come utilizzare un DML INSERT con Execute Immediate of Dynamic SQL e
  2. Come applicare la clausola USING per assegnare valori alla variabile bind utilizzata nella query SQL che desideriamo eseguire in modo dinamico.

Inoltre, assicurati di controllare il video in cui ho discusso su come gestire l'errore "ORA-01008:Non tutte le variabili associate". Scommetto che non vuoi perdere la soluzione a questo errore poiché è molto importante dal punto di vista della certificazione del database Oracle.

Inoltre, resta sintonizzato poiché nel prossimo tutorial impareremo come gestire più variabili di binding applicando la clausola Using di execute immediate in Oracle Database.

Spero che tu abbia imparato qualcosa di prezioso da questo blog. Nel frattempo, condividilo con i tuoi amici su Facebook, Twitter, WhatsApp o qualsiasi mezzo tu trovi conveniente. Inoltre, iscriviti al mio canale YouTube per tutorial più veloci e interessanti. Grazie e buona giornata!