Trong hướng dẫn này, tôi đưa ra một ví dụ về chương trình Oracle PL / SQL để chứng minh SQL động bằng cách sử dụng câu lệnh THỰC HIỆN NGAY LẬP TỨC.
Oracle PL / SQL THỰC HIỆN NGAY LẬP TỨC Ví dụ SQL động
Quy trình PL / SQL sau sẽ cập nhật bản ghi trong bảng Nhân viên cho ID nhân viên nếu giá trị khác với giá trị thực.
Câu lệnh Update sẽ được chuẩn bị động bằng cách sử dụng một chuỗi, và sau đó nó sẽ được thực thi bằng câu lệnh EXECUTE IMMEDIATE. Câu lệnh SQL sẽ chỉ được thực hiện cho các tham số được truyền và có các giá trị mới.
Ví dụ:nếu bạn muốn cập nhật first_name và mức lương của nhân viên, sau đó chuyển các giá trị cho tham số i_id, first_name và i_salary, tham số rest có thể là giá trị rỗng. Câu lệnh cập nhật sẽ chỉ được tạo cho các cột này.
CREATE OR REPLACE PROCEDURE update_emp_rec ( i_id IN employees.employee_id%TYPE, i_first IN employees.first_name%TYPE, i_last IN employees.last_name%TYPE, i_email IN employees.email%TYPE, i_phone IN employees.phone_number%TYPE, i_job IN employees.job_id%TYPE, i_salary IN employees.salary%TYPE, i_commission_pct IN employees.commission_pct%TYPE, i_manager_id IN employees.manager_id%TYPE, i_department_id IN employees.department_id%TYPE) AS emp_upd_rec employees%ROWTYPE; sql_string VARCHAR2 (1000); set_count NUMBER := 0; BEGIN SELECT * INTO emp_upd_rec FROM employees WHERE employee_id = i_id; sql_string := 'UPDATE EMPLOYEES SET '; IF i_first != emp_upd_rec.first_name THEN IF set_count > 0 THEN sql_string := sql_string || ', FIRST_NAME =''' || i_first || ''''; ELSE sql_string := sql_string || ' FIRST_NAME =''' || i_first || ''''; set_count := set_count + 1; END IF; END IF; IF i_last != emp_upd_rec.last_name THEN IF set_count > 0 THEN sql_string := sql_string || ', LAST_NAME =''' || i_last || ''''; ELSE sql_string := sql_string || ' LAST_NAME =''' || i_last || ''''; set_count := set_count + 1; END IF; END IF; IF UPPER (i_email) != emp_upd_rec.email THEN IF set_count > 0 THEN sql_string := sql_string || ', EMAIL =''' || UPPER (i_email) || ''''; ELSE sql_string := sql_string || ' EMAIL =''' || UPPER (i_email) || ''''; set_count := set_count + 1; END IF; END IF; IF UPPER (i_phone) != emp_upd_rec.phone_number THEN IF set_count > 0 THEN sql_string := sql_string || ', PHONE_NUMBER =''' || UPPER (i_phone) || ''''; ELSE sql_string := sql_string || ' PHONE_NUMBER =''' || UPPER (i_phone) || ''''; set_count := set_count + 1; END IF; END IF; IF i_job != emp_upd_rec.job_id THEN IF set_count > 0 THEN sql_string := sql_string || ', JOB_ID =''' || i_job || ''''; ELSE sql_string := sql_string || ' JOB_ID =''' || i_job || ''''; set_count := set_count + 1; END IF; END IF; IF i_salary != emp_upd_rec.salary THEN IF set_count > 0 THEN sql_string := sql_string || ', SALARY =' || i_salary; ELSE sql_string := sql_string || ' SALARY =' || i_salary; set_count := set_count + 1; END IF; END IF; IF i_commission_pct != emp_upd_rec.commission_pct THEN IF set_count > 0 THEN sql_string := sql_string || ', COMMISSION_PCT =' || i_commission_pct; ELSE sql_string := sql_string || ' COMMISSION_PCT =' || i_commission_pct; set_count := set_count + 1; END IF; END IF; IF i_manager_id != emp_upd_rec.manager_id THEN IF set_count > 0 THEN sql_string := sql_string || ', MANAGER_ID =' || i_manager_id; ELSE sql_string := sql_string || ' MANAGER_ID =' || i_manager_id; set_count := set_count + 1; END IF; END IF; IF i_department_id != emp_upd_rec.department_id THEN IF set_count > 0 THEN sql_string := sql_string || ', DEPARTMENT_ID =' || i_department_id; ELSE sql_string := sql_string || ' DEPARTMENT_ID =' || i_department_id; set_count := set_count + 1; END IF; END IF; sql_string := sql_string || ' WHERE employee_id = ' || i_id; IF set_count > 0 THEN DBMS_OUTPUT.put_Line (sql_string); EXECUTE IMMEDIATE sql_string; ELSE DBMS_OUTPUT.PUT_LINE ( 'No update needed, ' || 'all fields match original values'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('No matching employee found'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( 'Data entry error has occurred, ' || 'please check values and try again' || sql_string); END; /
Chạy quy trình
Sau đây là mã PL / SQL, để thực hiện quy trình trên để cập nhật first_name và mức lương cho ID nhân viên 199.
SET SERVEROUTPUT ON; DECLARE I_ID NUMBER; I_FIRST VARCHAR2 (20); I_LAST VARCHAR2 (25); I_EMAIL VARCHAR2 (25); I_PHONE VARCHAR2 (20); I_JOB VARCHAR2 (10); I_SALARY NUMBER; I_COMMISSION_PCT NUMBER; I_MANAGER_ID NUMBER; I_DEPARTMENT_ID NUMBER; BEGIN I_ID := 199; I_FIRST := 'Joseph'; I_LAST := NULL; I_EMAIL := NULL; I_PHONE := NULL; I_JOB := NULL; I_SALARY := 3099; I_COMMISSION_PCT := NULL; I_MANAGER_ID := NULL; I_DEPARTMENT_ID := NULL; UPDATE_EMP_REC (I_ID, I_FIRST, I_LAST, I_EMAIL, I_PHONE, I_JOB, I_SALARY, I_COMMISSION_PCT, I_MANAGER_ID, I_DEPARTMENT_ID); COMMIT; END; /
Đầu ra
UPDATE EMPLOYEES SET FIRST_NAME ='Joseph', SALARY =3099 WHERE employee_id = 199 PL/SQL procedure successfully completed.
Xem thêm:
- Làm thế nào để cắt bớt bảng trong thủ tục Oracle?
- Ví dụ về SQL động của Oracle để chèn bản ghi bằng DBMS_SQL
- Làm cách nào để in 1 đến 10 mà không cần sử dụng vòng lặp trong PL / SQL?
-
Làm cách nào để đặt lại một trình tự trong Oracle?
-
Làm thế nào để UNZIP một tệp trong PL / SQL?
-
Làm cách nào để xử lý các ngoại lệ to_date trong trạng thái SELECT để bỏ qua các hàng đó?
-
Làm thế nào để tạo gói trong Oracle SQL Developer?
-
Chúng ta có cần chỉ định không null cho khóa chính không? Oracle / SQL