In deze tutorial geef ik een Oracle dynamisch SQL-voorbeeld om een record in te voegen met behulp van het DBMS_SQL-pakket.
Via dynamische SQL kunt u elke DML- en DDL-instructie ontleden met behulp van PL/SQL om een bepaalde taak in Oracle Database uit te voeren.
Oracle Dynamic SQL Voorbeeld:Nieuw record invoegen met DBMS_SQL
De volgende PL/SQL-procedure zal een nieuw record invoegen in de EMPLOYEES-tabel van het HR-schema. Een stringvariabele "V_SQL" wordt gebruikt voor insert-instructie, zodat deze kan worden gemanipuleerd en geparseerd met behulp van de DBMS_SQL. De opgeslagen procedure accepteert zeven parameters die worden gebruikt om te binden met behulp van de DBMS_SQL.BIND_VARIABLE-methode. Geef ook het script voor de tabel en het reeksobject zodat je lokaal kunt testen.
Maak WERKNEMERS-tabel
CREATE TABLE EMPLOYEES ( EMPLOYEE_ID NUMBER (6), FIRST_NAME VARCHAR2 (20 BYTE), LAST_NAME VARCHAR2 (25 BYTE) NOT NULL, EMAIL VARCHAR2 (25 BYTE) NOT NULL, PHONE_NUMBER VARCHAR2 (20 BYTE), HIRE_DATE DATE NOT NULL, JOB_ID VARCHAR2 (10 BYTE) NOT NULL, SALARY NUMBER (8, 2), COMMISSION_PCT NUMBER (2, 2), MANAGER_ID NUMBER (6), DEPARTMENT_ID NUMBER (4) ) /
Een reeksobject maken
CREATE SEQUENCE employee_seq START WITH 1 INCREMENT BY 1 ORDER /
Opgeslagen procedure maken
CREATE OR REPLACE PROCEDURE new_employee (i_FIRST IN VARCHAR2,
i_LAST IN VARCHAR2,
i_email IN VARCHAR2,
i_phone IN VARCHAR2,
i_hired IN DATE,
i_job IN VARCHAR2,
i_deptno IN NUMBER DEFAULT 0)
AS
v_sql VARCHAR2 (1000);
cursor_var NUMBER := DBMS_SQL.OPEN_CURSOR;
rows_complete NUMBER := 0;
next_emp_id NUMBER := employee_seq.NEXTVAL;
BEGIN
IF i_deptno != 0
THEN
v_sql :=
'INSERT INTO EMPLOYEES ( '
|| 'employee_id, first_name, last_name, email, '
|| 'phone_number, hire_date, job_id, department_id) '
|| 'VALUES( '
|| ':next_emp_id, :first, :last, :email, :phone, :hired, '
|| ':job_id, :dept)';
ELSE
v_sql :=
'INSERT INTO EMPLOYEES ( '
|| 'employee_id, first_name, last_name, email, '
|| 'phone_number, hire_date, job_id) '
|| 'VALUES( '
|| ':next_emp_id, :first, :last, :email, :phone, :hired, '
|| ':job_id)';
END IF;
DBMS_SQL.PARSE (cursor_var, v_sql, DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE (cursor_var, ':next_emp_id', next_emp_id);
DBMS_SQL.BIND_VARIABLE (cursor_var, ':first', i_FIRST);
DBMS_SQL.BIND_VARIABLE (cursor_var, ':last', i_LAST);
DBMS_SQL.BIND_VARIABLE (cursor_var, ':email', i_email);
DBMS_SQL.BIND_VARIABLE (cursor_var, ':phone', i_phone);
DBMS_SQL.BIND_VARIABLE (cursor_var, ':hired', i_hired);
DBMS_SQL.BIND_VARIABLE (cursor_var, ':job_id', i_job);
IF i_deptno != 0
THEN
DBMS_SQL.BIND_VARIABLE (cursor_var, ':dept', i_deptno);
END IF;
rows_complete := DBMS_SQL.EXECUTE (cursor_var);
DBMS_SQL.CLOSE_CURSOR (cursor_var);
COMMIT;
END;
/ Test
DECLARE
I_FIRST VARCHAR2 (32767);
I_LAST VARCHAR2 (32767);
I_EMAIL VARCHAR2 (32767);
I_PHONE VARCHAR2 (32767);
I_HIRED DATE;
I_JOB VARCHAR2 (32767);
I_DEPTNO NUMBER;
BEGIN
I_FIRST := 'Kevin';
I_LAST := 'John';
I_EMAIL := 'kjohn@gmail.com';
I_PHONE := '2299378';
I_HIRED := SYSDATE;
I_JOB := 'CLERK';
I_DEPTNO := 10;
NEW_EMPLOYEE (I_FIRST,
I_LAST,
I_EMAIL,
I_PHONE,
I_HIRED,
I_JOB,
I_DEPTNO);
END; Resultaat

Zie ook:
- Een voorbeeld om de kwetsbaarheid van SQL-injectie en de preventie ervan in Oracle aan te tonen