Trong hướng dẫn này, tôi đưa ra một ví dụ SQL động Oracle để chèn một bản ghi bằng gói DBMS_SQL.
Thông qua SQL động, bạn có thể phân tích cú pháp bất kỳ câu lệnh DML và DDL nào bằng PL / SQL để thực thi nhằm thực hiện một tác vụ cụ thể trong Cơ sở dữ liệu Oracle.
Ví dụ SQL động của Oracle:Chèn bản ghi mới bằng DBMS_SQL
Quy trình PL / SQL sau sẽ chèn một bản ghi mới vào bảng NHÂN VIÊN của lược đồ nhân sự. Biến chuỗi "V_SQL" được sử dụng cho câu lệnh chèn, để nó có thể được thao tác và phân tích cú pháp bằng cách sử dụng DBMS_SQL. Thủ tục được lưu trữ chấp nhận bảy tham số sẽ được sử dụng để liên kết bằng phương thức DBMS_SQL.BIND_VARIABLE. Đồng thời cung cấp tập lệnh cho đối tượng bảng và chuỗi để bạn có thể kiểm tra cục bộ.
Tạo bảng NHÂN VIÊN
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) ) /
Tạo một đối tượng trình tự
CREATE SEQUENCE employee_seq START WITH 1 INCREMENT BY 1 ORDER /
Tạo quy trình đã lưu trữ
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; /
Kiểm tra
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 := '[email protected]'; 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;
Kết quả
Xem thêm:
- Một ví dụ để chứng minh lỗ hổng của SQL Injection và cách ngăn chặn nó trong Oracle