1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài thực hành bảo mật hệ thống thông tin số 5 PLSQL

15 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 15
Dung lượng 223,22 KB

Nội dung

Bảo Mật Hệ Thống Thông Tin Lab Bài thực hành số PL/SQL (2)  Tóm tắt nội dung:  Xử lý ngoại lệ  Procedure Function  Cursor  Trigger I Xử lý ngoại lệ Giới thiệu Exception  Các Exception danh định PL/SQL mà gặp phải thực thi khối dẫn đến thân tác vụ bị kết thúc Một khối luôn kết thúc gặp exception, exception handler để thi hành tác vụ cuối trước khối bị kết thúc Nếu exception kiểm sốt (handled) exception khơng truyền ngồi khối hay mơi trường Hai nhóm exception :  Predefined: định nghĩa trước bới PL/SQL dính với mã lỗi xác định  User-defined: khai báo khối, thường dùng có nhu cầu cụ thể với chúng, ngồi gắn chúng với mã lỗi cần thiết  Trong này, tập trung vào exception định nghĩa trước: Tên Exception Lỗi Oracle - DUP_VAL_ON_INDEX -1 INVALID_CURSOR -1001 INVALID_NUMBER -1722 LOGIN_DINIED -1017 NO_DATA_FOUND -1403 (ANSI +100) NOT_LOGGED_ON -1012 Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thông Tin Lab PROGRAM_ERROR -6501 STORAGE_ERROR -6500 TIMEOUT_ON_RESOURCE -51 TOO_MANY_ROWS -1422 VALUES_ERROR -6502 ZERO_DIVIDE -1476 CURSOR_ALREADY_OPEN -6511 TRANSACTION_BACKED_OUT -61 Bộ kiểm soát lỗi  Nếu exception xảy ra, quyền điều khiển chuyển cho phần EXCEPTION khối mà xảy Nếu exception khơng kiểm sốt phần khơng có phần khối kết thúc với exception unhandled tác động đến mơi trường ngồi Ví dụ: BEGIN INSERT INTO dept (deptno, dname) VALUES (50, ’CLEANING’); INSERT INTO dept (deptno, dname) VALUES (50, ‘TRANING’); Exception DUP_VAL_ON_INDEX xảy END; Khối kết thúc với exception unhandled ORA-00001  Để bẫy kiện chận exception, định nghĩa exception handler phần EXCEPTION Cú pháp: WHEN exceptionn-identifier THEN actions; Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thông Tin Lab Ví dụ : DECLARE v_ename emp.ename%TYPE; v_job emp.job%TYPE; BEGIN SELECT ename, job INTO v_name, v_job FROM emp WHERE hiredate BETWEEN ‘01/01/92’ AND ‘31/12/92’; EXCEPTION WHEN no_data_found THEN INSERT INTO error_tab VALUES (‘Nobody in 92’); WHEN too_many_rows THEN INSERT INTO error_tab VALUES (‘More than one person in 92’); END;  Bộ kiểm sốt lỗi ‘WHEN OTHERS’: dùng định nghĩa để chặn tất exception lại exception định nghĩa phần EXCEPTION Phần đặt cuối phần EXCEPTION Ví dụ: BEGIN SAVEPOINT so_far_so_good; INSERT INTO statistics_tab VALUES (18, 25, 91); EXCEPTION WHEN dup_val_on_index THEN ROLLBACK TO so_far_so_good; WHEN OTHERS THEN INSERT INTO error_tab VALUES (‘Error during block’); END; Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thông Tin Lab Các hàm dùng bẫy lỗi  Khi exception xảy ra, ta xác định mã lỗi câu PL/SQL cung cấp hàm: SQLCODE SQLERR Trả mã lỗi exception Nếu dùng ngồi phần EXCEPTION mã trả Trả toàn câu lỗi (error message) có mã lỗi M Ví dụ: DECLARE error_message CHAR (100); error_code NUMBER; BEGIN … EXCEPTION WHEN OTHERS THEN error_message := SUBSTR (SQLERRM, 1, 100); error_code := SQLCODE; INSERT INTO error VALUES (error_message, error_code); END; II Procedure  Cú pháp: CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_name [IN | OUT | IN OUT] datatype )] {IS | AS} BEGIN procedure_body END procedure_name; Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thông Tin  Lab Chú ý: Datatype kiểu tham số, khai báo kiểu ko khai báo chiều dài tham số Ví dụ khơng khai báo tham số VARCHAR2(10) mà phải khai báo VARCHAR2 Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thơng Tin Lab Ví dụ: CREATE OR REPLACE PROCEDURE update_product_price( p_product_id IN products.product_id%TYPE, p_factor IN NUMBER) AS v_product_count INTEGER; BEGIN SELECT COUNT(*) INTO v_product_count FROM products WHERE product_id = p_product_id; IF v_product_count = THEN UPDATE products SET price = price * p_factor WHERE product_id = p_product_id; COMMIT; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END update_product_price;  Vì procedure cần phải gọi khối PL/SQL, nên muốn chạy từ dấu nhắc SQL*Plus ta dùng lệnh EXECUTE lồng cặp BEGIN-END Ví dụ : SQL> EXECUTE update_product_price(1, 1.5); Hay SQL> BEGIN update_product_price(1, 1.5); END; Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thông Tin Lab III Function  Cú pháp: CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_name [IN | OUT | IN OUT] datatype )] RETURN datatype {IS | AS} BEGIN procedure_body END procedure_name; Ví dụ: create or replace function get_dname( y number) return varchar2 is m char(14); begin select dname into m from dept where deptno=y; if SQL%notfound then m:='Khong thay'; end if; return (rtrim(m)); end;  Để gọi function ta gọi trực tiếp thơng qua phép gán Ví dụ: SQL> select * from dept where dname=get_dname(10); DEPTNO 10 DNAME LOC - ACCOUNTING NEW YORK SQL> select get_dname (20) from dual; Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thông Tin Lab GET_DNAME (20) -RESEARCH IV Cursor Định nghĩa  Oracle dùng vùng làm việc gọi ‘các vùng SQL dùng riêng’ (private SQL areas) để thi hành câu lệnh SQL lưu trữ thông tin trình Một cursor cấu trúc PL/SQL cho phép định danh vùng truy cập đến thơng tin lưu Có kiểu cursor : Được mô tả PL/SQL ẩn dành cho tất câu lệnh DML Implicit Cursors cho query trả đơn hàng (ví dụ lệnh SELECT dùng trực tiếp khối) Mô tả rõ ràng với danh định khối thao tác Explicit Cursors câu lệnh đặc trưng tác vụ khối Các cursor dành cho query cho phép nhiều hàng xử lý từ query Explicit cursor điều khiển qua kiểu tác vụ riêng lẻ sau : Định tên cursor cấu trúc query thực thi Tại DECLARE thời điểm này, query phân tích (các cột, bảng, …) chưa thi hành OPEN Thi hành query ràng buộc biến có tham khảo đến Các hàng trả query gọi ‘active set’ sẵn sàng cho việc lấy liệu Lấy liệu từ hàng vào biến Hàng hàng mà FETCH cursor đến Mỗi lần FETCH, cursor di chuyển trỏ đến hàng active set, lệnh FETCH truy cập đến hàng khác query CLOSE Hủy bỏ tập hàng làm việc sinh lệnh OPEN Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thông Tin Lab cuối cursor Có thể OPEN lại có tập hàng làm việc Khai báo  Cú pháp: CURSOR indentifier [(parameter details)] IS query-expression; Ví dụ: DECLARE CURSOR c1 IS SELECT last_name, salary, hire_date, job_id FROM employees WHERE employee_id = 120; /* khai báo biến record để đại diện hàng fetch từ bảng employees */ employee_rec c1%ROWTYPE; BEGIN mở cursor cách tường minh sử dụng cursor để fetch liệu đổ vào employee_rec OPEN c1; FETCH c1 INTO employee_rec; DBMS_OUTPUT.PUT_LINE('Employee name: ' || employee_rec.last_name); END; Các thuộc tính explicit cursor (Explicit Cursor Attributes)  Giống implicit cursor, có thuộc tính để biết thơng tin cursor Khi dùng, phải để tên cursor trước thuộc tính Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thơng Tin Lab Có giá trị TRUE lệnh FETCH gần từ cursorlấy hàng %FOUND từ active set, ngược lại FALSE %NOTFOUND Ngược với %FOUND %ROWCOUNT Trả số hàng FETCH từ active set tính đến TRUE cursor mở, FALSE cursor đóng chưa %ISOPEN mở khối Ví dụ : IF c1%ISOPEN THEN FETCH c1 INTO v_ename, v_sal, v_hiredate; ELSE OPEN c1; END IF; Ví dụ : LOOP FETCH c1 INTO v_ename, v_sal, v_hiredate; EXIT WHEN c1%ROWCOUNT > 10; END LOOP; Điều khiển việc lấy nhiều liệu từ explicit cursor  Thường muốn xử lý nhiều hàng từ explicit cursor dùng vịng lặp với lệnh FETCH bước lặp Nếu trình tiếp tục tất hàng active set xử lý Khi lệnh FETCH không thành cơng xẩy ra, thuộc tính %NOTFOUND TRUE Mặc dù vậy, dùng lệnh FETCH xảy lỗi : ORA-1002:  Fetch out of sequence Lỗi kết thúc khối thường unhandled exception Vì cần thiết phải kiểm tra thành công lần FETCH trước tiếp tục tham khảo cursor Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM 10 Bảo Mật Hệ Thống Thơng Tin Lab Ví dụ : OPEN cursor_1; LOOP FETCH cursor_1 INTO a, b, c, d; EXIT WHEN cursor_1%NOTFOUND; xử lý hàng END LOOP; Mệnh đề FOR UPDATE OF Ví dụ : DECLARE CURSOR c1 IS SELECT empno, sal, hiredate, rowid FROM emp WHERE depno=20 AND job=’ANALYST’ FOR UPDATE OF sal; emp_record c1%ROWTYPE; BEGIN OPEN c1; … FETCH c1 INTO emp_record; … IF emp_record.sal < 2000 THEN … … END;  Ví dụ dùng FOR UPDATE query cursor Nghĩa hàng trả query khóa khơng cho khác truy xuất vào OPEN dùng Khi bỏ khóa cuối giao dịch, không cần COMMIT Mệnh đề WHERE CURRENT OF  Khi tham khảo ‘current row’ từ explicit cursor, lệnh SQL dùng mệnh đề WHERE CURRENT OF Nó cho phép cập nhật hay xóa bỏ hàng Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM 11 Bảo Mật Hệ Thống Thông Tin Lab Ví dụ : FETCH c1 INTO emp_record; IF emp_record.ename = ‘KING’ THEN DELETE FROM emp WHERE CURRENT OF c1; V Triggers  Một Database Trigger tạo lưu trữ PL/SQL block tương ứng với table Nó tự động gọi đến có truy nhập đến table tương ứng với hành động định nghĩa  Cú pháp: CREATE [OR REPLACE] TRIGGER trigger_name BEFORE | AFTER UPDATE | DELECT | INSERT (OF column) ON TABLE (FOR EACH ROW (WHEN condition)) BEGIN PL/SQL block END trigger_name; Ví dụ:  Tạo bảng: CREATE TABLE product_price_audit (product_id INTEGER CONSTRAINT price_audit_fk_products REFERENCES products(product_id), old_price NUMBER(5, 2), new_price NUMBER(5, 2)); Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM 12 Bảo Mật Hệ Thống Thông Tin Lab  Tạo Trigger CREATE OR REPLACE TRIGGER before_product_price_update BEFORE UPDATE OF price ON products FOR EACH ROW WHEN (new.price < old.price * 0.75) BEGIN dbms_output.put_line('product_id = ' || :old.product_id); dbms_output.put_line('Old price = ' || :old.price); dbms_output.put_line('New price = ' || :new.price); dbms_output.put_line('The price reduction is more than 25%'); insert row into the product_price_audit table INSERT INTO product_price_audit ( product_id, old_price, new_price) VALUES (:old.product_id, :old.price, :new.price); END before_product_price_update;  Firing a Trigger: để thấy output từ trigger, bạn cần phải chạy câu lệnh: SET SERVEROUTPUT ON UPDATE products SET price = price * WHERE product_id IN (5, 10); product_id = 10 Old price = 15.99 New price = 11.19 The price reduction is more than 25% product_id = Old price = 49.99 New price = 34.99 The price reduction is more than 25% rows updated Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM 13 Bảo Mật Hệ Thống Thơng Tin Lab  Disable and Enable Trigger Có thể cấm trigger hoạt động ngược lại câu lệnh ALTER TRIGGER ALTER TRIGGER before_product_price_update DISABLE; ALTER TRIGGER before_product_price_update ENABLE; VI Bài tập  Các tập lab có sử dụng đến bảng Message mô tả lab Đoạn mã sau cần phải thi hành vòng lặp với giá trị khác v bước lặp (tầm từ đến 10) UPDATE message SET numcol2 = 100 WHERE numcol1 = v; Nếu q trình UPDATE mà khơng có có nhiều hàng khỏi vịng lặp (Có thể dùng SQL%ROWCOUNT để kiểm tra) Sửa đổi khối bạn viết tập Định nghĩa lại biến PL/SQL NUMBER(1) Điều xảy giá trị gán vào 42.Thêm kiểm soát exception vào khối để lưu lại câu giải thích MESSAGE cho kiều exception xảy Chạy khối lần Dùng explixit cursor thuộc tính nó: Cho bảng Dept gồm thuộc tính ID phịng ban, tên phịng ban địa điểm phòng ban chi nhánh khác Dept( ID, dname, loc) Xử lý hàng bảng ‘Dept’, di chuyển phòng SALES đến địa điểm Dallas phịng khác đến New York Ngồi đếm số phịng ban địa điểm Tạo file cript SQL*Plus chấp nhận tham số đơn kiểu nghề nghiệp lúc chạy chương trình : Ví dụ : @UNIT3_FILE MANAGER Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM 14 Bảo Mật Hệ Thống Thông Tin Lab Trong khối PL/SQL, dùng lệnh SELECT lấy hàng từ bảng ‘emp’ với điều kiện ‘job’ tham số nhập vào (Tham khảo đến tham số ‘&1’) Gửi giải đến bảng MESSAGE tùy vào việc có hàng, khơng hàng vài hàng trả Ví dụ : ‘Jobtype found once’ ‘Jobtype found more than once’ ‘Jobtype not found’ Lưu jobtype bảng MESSAGE COMMIT giao dịch để giải tạo Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM 15 .. .Bảo Mật Hệ Thống Thông Tin Lab PROGRAM_ERROR - 650 1 STORAGE_ERROR - 650 0 TIMEOUT_ON_RESOURCE -51 TOO_MANY_ROWS -1422 VALUES_ERROR - 650 2 ZERO_DIVIDE -1476 CURSOR_ALREADY_OPEN - 651 1 TRANSACTION_BACKED_OUT... Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thông Tin  Lab Chú ý: Datatype kiểu tham số, khai báo kiểu ko khai báo chiều dài tham số Ví dụ không khai báo tham số VARCHAR2(10) mà phải khai... update_product_price(1, 1 .5) ; Hay SQL> BEGIN update_product_price(1, 1 .5) ; END; Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM Bảo Mật Hệ Thống Thông Tin Lab III Function 

Ngày đăng: 29/12/2022, 14:57

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN