Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 24 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
24
Dung lượng
0,93 MB
Nội dung
Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Lab 03 Bài thực hành số PL/SQL Tóm tắt nội dung: Khái niệm PL/SQL Các vấn đề liên quan đến kiểu liệu PL/SQL Hằng Biến Cấu trúc khối PL/SQL Các câu lệnh điều khiển Xử lý ngoại lệ Procedure Function Cursor Trigger I PL/SQL ? PL/SQL (PL : Procedural Language – Ngôn ngữ Thủ tục) mở rộng SQL, kết hợp vào nhiều đặc tính ngơn ngữ lập trình gần Nó cho phép thao tác liệu câu lệnh query SQL bao gồm đoạn mã có cấu trúc khối tính thủ tục (block-structure and procedural unit of code), làm cho PL/SQL thành ngôn ngữ xử lý giao dịch mạnh mẽ II Các lệnh SQL PL/SQL PL/SQL cung cấp số câu lệnh thủ tục cho việc thao tác kiểm tra liệu, thường khơng cần phải dính dáng với lệnh SQL Dù vậy, cần lấy thống tin từ CSDL thay đổi CSDL nên dùng SQL PL/SQL hỗ trợ tốt cho đa số lệnh DML lệnh điều khiển giao dịch SQL Ngồi ra, câu lệnh SELECT dùng để gán giá trị query từ hàng bảng cho biến BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Lab 03 Một số điểm lưu ý: Một khối PL/SQL đơn vị giao dịch (transaction unit) – lệnh COMMIT ROLLBACK độc lập với khối nằm Mỗi câu lệnh SQL cần phải kết thúc dấu chấm phẩy Câu lệnh SELECT dùng để gán giá trị query từ hàng bảng cho biến Các câu lệnh SELECT mà không trả lại hàng gây lỗi cần phải giải (thường phải dùng phương pháp xử lý ngoại lệ cursor) Các lệnh DDL khơng dùng PL/SQL Ví dụ: - Tất lệnh bắt đầu ALTER, CREATE, DROP, FLASHBACK - Các lệnh quản lý quyền: GRANT, REVOKE - Các lệnh audit: AUDIT, NOAUDIT (và nhiều lệnh khác) Các lệnh DML xử lý nhiều hàng (multiple rows) III Kiểu liệu PL/SQL hỗ trợ nhiều kiểu liệu để khai báo biến Có thể gán giá trị ban đầu cho biến khai báo biến thay đổi giá trị chúng thông qua phát biểu gán sau khối Các danh hiệu (identifier) lưu giữ giá trị cố định giá trị phải gán cho khai báo Các kiểu liệu: BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Lab 03 Dữ liệu số: NUMBER Ví dụ: NUMBER(7,2) Nghĩa có ký số có ký số sau dấu thập phân Nếu ta khơng khai báo độ xác câu lệnh độ xác mặc định 38 ký số Dữ liệu luận lí: BOOLEAN Dữ liệu ngày tháng: DATE Dữ liệu chuỗi: VARCHAR2 Lưu trữ liệu ký tự có chiều dài thay đổi Chiều dài mặc định ký tự Chiều dài tối đa 32767 Ví dụ: VARCHAR2(30) CHAR PL/SQL Version 1: giống VARCHAR2 chiều dài tối đa 255 PL/SQL Version 2: chuỗi ký tự chiều dài cố định dài tối đa 32767 byte Khi so sánh hai chuỗi với ký tự trống thêm vào Chú ý: Khi so sánh chuỗi CHAR PL/SQL Version hai chuỗi khơng thêm vào ký tự trống, ví dụ biến kiểu CHAR chứa ‘FRED’ khác với biến kiểu CHAR chứa ‘FRED ’ IV Khai báo biến Khai báo biến Các biến PL/SQL khai báo gán giá trị ban đầu phần DECLARE khối Các biến khác tham khảo đến phần khai báo chúng phải khai báo phát biểu trước Cú pháp: identifier datatype [(precision, scale)] [NOT NULL] [ := expression]; identifier - tên biến datatype - kiểu liệu biến precision - chiều dài biến (số ký số phần nguyên phần thập phân) BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Bảo Mật Hệ Thống Thông Tin – 2013 scale PL/SQL Lab 03 - số số lẻ (số ký số phần thập phân) Nếu không gán giá trị ban đầu cho biến biến chứa giá trị NULL gán giá trị Ràng buộc NOT NULL không dùng trường hợp Ví dụ: v_count NUMBER NOT NULL := 0; v_saraly NUMBER(7,2); v_annsal NUMBER(9,2) := month_sal * 12; month_sal phải tồn trước postcost CHAR(7); surname VARCHAR2(25) := ‘Skywalker’; v_message VARCHAR2(80) := ‘Data is wrong !’; married BOOLEAN := FALSE; today DATE := SYSDATE; Không nên đặt tên biến trùng tên với tên cột bảng dùng khối Nếu biến phát biểu SQL có tên với tên cột Oracle xem tên tên cột (mà khơng phải tên biến) Ví dụ: DECLARE bonus NUMBER(8,2); emp_id NUMBER(6) := 100; BEGIN SELECT salary * 0.10 INTO bonus FROM employees WHERE employee_id = emp_id; END; Khai báo Cú pháp: identifier CONSTANT datatype [(precision,scale)] := expression; Ví dụ: pi CONSTANT NUMBER(9,5) := 3.14159; vat CONSTANT NUMBER(4,2) := 17.5; BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Lab 03 Chú ý: Dùng từ khóa %TYPE để khai báo kiểu với cột định table view Ví dụ: biến product_type có kiểu với cột price bảng products: product_price products.price%TYPE; Dùng từ khoá %ROWTYPE để khai báo kiểu record đại diện cho hàng table view Các trường record có tên kiểu liệu với cột table/view Ví dụ: emprec employees_temp%ROWTYPE; V Các biến kết hợp SQL*Plus SQL*Plus hỗ trợ biến kết hợp (bind variable) Đây biến dùng để gửi giá trị vào hay khối PL/SQL Cú pháp: VARIABLE variable_name [NUMBER | CHAR | CHAR(n) | VARCHAR2 | VARCHAR2(n) ] Ví dụ : VARIABLE deptnum NUMBER; /*Chúng dùng khối PL/SQL với dấu chấm phía trước */ BEGIN SELECT DEPTNO INTO :deptnum FROM DEPT WHERE DNAME = ‘ACCOUNTING’; INSERT INTO RESULTS VALUES(:deptnum); END; Trong ví dụ trên, giá trị DEPTNO lấy gán cho biến deptnum Sau ghi vào bảng RESULTS Sau chạy xong khối PL/SQL, bạn hiển thị giá trị biến kết hợp lệnh PRINT : BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Lab 03 SQL> PRINT deptnum DEPTNUM 10 VI Hàm chuyển đổi kiểu TO_CHAR TO_DATE TO_NUMBER Ví dụ : v_message VARCHAR2(80) := ‘SCOTT earns ‘ || TO_CHAR (month_sal * 12); VII Độ ưu tiên toán tử Toán tử Đầu tiên **, NOT Tác vụ Toán tử mũ, phủ định luận lý +, - Đồng nhất, dấu âm *, / Nhân, chia +, -, || Cộng, trừ, nối chuỗi =, !=, , =, IS NULL, LIKE, So sánh BETWEEN, IN Cuối AND Giao OR Hội VIII Cấu trúc khối Cú pháp: [ DECLARE declaration_statements ] BEGIN BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Lab 03 executable_statements [ EXCEPTION exception_handling_statements ] END; DECLARE EXCEPTION phần tự chọn, có vài khối khơng có phần Ví dụ: (ví dụ command line) SQL> DECLARE x NUMBER(7,2); BEGIN SELECT sal INTO x FROM emp WHERE empno=123; IF x THEN message := 'count is positive'; IF area > THEN message := 'count and area are positive'; END IF; ELSIF count = THEN message := 'count is zero'; ELSE message := 'count is negative'; END IF; X Vòng lặp Vòng lặp Cú pháp: LOOP statements END LOOP; Mỗi lần dòng chương trình gặp phải END LOOP quyền điều khiển trả LOOP Vòng lặp khơng điều khiển lặp mãi thân khơng có lệnh nhảy khỏi Một vòng lặp kết thúc từ bên dùng câu lệnh EXIT EXIT cho phép điều khiển chuyển cho câu lệnh sau END LOOP kết thúc vòng lặp Cú pháp : EXIT [loop-label] [WHEN condition]; EXIT tác vụ nằm câu lệnh IF đứng vòng lặp Khi đứng mệnh đề WHEN dùng để kết thúc có điều kiện BM Hệ Thống Thơng Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Lab 03 Ví dụ 1: LOOP counter := counter + 1; INSERT INTO numbered_rows VALUES (counter); … IF counter = 10 THEN COMMIT; EXIT; END IF; END LOOP; Ví dụ : LOOP … EXIT WHEN total_sals = 60000; … END LOOP; Cách ngắt vòng lặp khác rẽ nhánh đến nhãn ngồi vòng lặp, dùng lệnh GOTO Nhưng khơng phải cách viết có cấu trúc Vòng lặp WHILE Cú pháp : WHILE condition LOOP statements END LOOP; Điều kiện (condition) tính tốn điểm bắt đầu vòng lặp vòng lặp kết thúc điều kiện FALSE Nếu điều kiện FALSE lúc bắt đầu vào đến vòng lặp vòng lặp khơng xảy Ví dụ: counter := 0; WHILE counter < LOOP counter := counter + 1; END LOOP; BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Vòng lặp FOR Cú pháp: FOR loop_variable IN [REVERSE] lower_bound upper_bound LOOP statements END LOOP; Ví dụ: FOR count2 IN LOOP DBMS_OUTPUT.PUT_LINE(count2); END LOOP; Điều khiển vòng lặp lồng Thơng thường, vòng lặp kết thúc khơng kết thúc vòng lặp ngồi (ngoại trừ có lỗi) Dù vậy, vòng lặp gán nhãn kết thúc vòng lặp lệnh EXIT Các nhãn PL/SQL định nghĩa sau : > Ví dụ : LOOP … LOOP … thoát vòng lặp EXIT main WHEN total_done=’YES’; khỏi vòng lặp EXIT WHEN innder_done=’YES’; … END LOOP; END LOOP main; Ngồi nhãn dùng để định danh vòng lặp chúng có cấu trúc lồng BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 10 Lab 03 Bảo Mật Hệ Thống Thơng Tin – 2013 PL/SQL Ví dụ: DECLARE var1 NUMBER; BEGIN DECLARE var1 NUMBER := 400; BEGIN biến var1 khối block1 tăng lên block1.var1 := block1.var1 + 1; END block2; END block1; XI 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 soá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_DENIED -1017 NO_DATA_FOUND -1403 (ANSI +100) NOT_LOGGED_ON -1012 BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 11 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL 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; Ví dụ : DECLARE v_ename emp.ename%TYPE; BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 12 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL v_job emp.job%TYPE; SELECT ename, job INTO v_name, v_job FROM emp BEGIN 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 soát lỗi ‘WHEN OTHERS’: dùng định nghĩa để chặn tất exception lại ngồ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; 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: BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 13 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 SQLCODE PL/SQL Trả mã lỗi exception Nếu dùng ngồi phần EXCEPTION mã trả SQLERRM Trả toàn câu lỗi (error message) có mã lỗi 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; XII 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ú ý: 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 Ví dụ: CREATE OR REPLACE PROCEDURE update_product_price( BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 14 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL 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; XIII Function Cú pháp: CREATE [OR REPLACE] FUNCTION function_name [(parameter_name [IN | OUT | IN OUT] datatype )] RETURN datatype BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 15 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL {IS | AS} BEGIN function_body END function_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ụ 1: SQL> select * from dept where dname = get_dname(10); DEPTNO 10 DNAME LOC - ACCOUNTING NEW YORK Ví dụ 2: SQL> select get_dname (20) from dual; GET_DNAME (20) -RESEARCH BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 16 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL XIV 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 q 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 FETCH mà 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 Hủy bỏ tập hàng làm việc sinh lệnh OPEN CLOSE cuối cursor Có thể OPEN lại có tập hàng làm việc BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 17 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL 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); CLOSE c1; 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 %FOUND Có giá trị TRUE lệnh FETCH gần từ cursorlấy hàng 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 %ISOPEN TRUE cursor mở, FALSE cursor đóng chưa mở khối BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 18 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Ví dụ 1: IF c1%ISOPEN THEN FETCH c1 INTO v_ename, v_sal, v_hiredate; ELSE OPEN c1; END IF; Ví dụ 2: 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 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ụ : BM Hệ Thống Thơng Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 19 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL 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 Ví dụ : FETCH c1 INTO emp_record; IF emp_record.ename = ‘KING’ THEN DELETE FROM emp WHERE CURRENT OF c1; XV 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 BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 20 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL [UPDATE (OF column)] | [DELETE] | [INSERT] 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)); 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 BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 21 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL 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 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; XVI Bài tập Trong tập đây, bạn tạo khối PL/SQL buffer SQL*Plus sau lưu chúng xuống file tạo file riêng trình soạn thảo khác Trong nhiều tập, bạn cần phải lưu trữ kết bảng, giả thiết bảng chung MESSAGES dùng Nó định nghĩa sau : Table MESSAGES Column Description - NUMCOL1 NUMBER (9,2) NUMCOL2 NUMBER (9,2) CHARCOL1 VARCHAR2 (60) CHARCOL2 VARCHAR2 (60) DATECOL1 DATE DATECOL2 DATE BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 22 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Tạo khối dùng biểu thức PL/SQL đơn giản, khai báo biến : V_BOOL1 Boolean V_BOOL2 Boolean V_CHAR Character (chiều dài thay đổi) V_NUM Number Sau gán cho giá trị sau : Variable Value - V_CHAR Câu ‘42 is the answer’ V_NUM Hai ký tự đầu từ V_CHAR V_BOOL1 TRUE FALSE (tùy vào V_NUM có nhỏ lơn 100 hay V_BOOL2 Ngược lại với V_BOOL1 không) Tạo chạy khối PL/SQL nhận biến SQL*Plus Biến cần phải lũy thừa lên với số mũ số thứ hai kết gán cho biến PL/SQL Lưu kết bảng MESSAGES biến kết hợp (bind) SQL*Plus Viết khối PL/SQL để chèn hàng vào bảng MESSAGES với NUMCOL1 có giá trị hàng chèn vào, hàng thứ 2, … Không chèn hàng vào đếm đến khỏi vòng lặp sau sau chèn đến 10 COMMIT kết thúc vòng lặp Đ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 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) BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 23 Lab 03 Bảo Mật Hệ Thống Thông Tin – 2013 PL/SQL Đ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 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 BM Hệ Thống Thông Tin – Khoa KH & KTMT – ĐH Bách Khoa HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 24 Lab 03 ... Tạo chạy khối PL/ SQL nhận biến SQL* Plus Biến cần phải lũy thừa lên với số mũ số thứ hai kết gán cho biến PL/ SQL Lưu kết bảng MESSAGES biến kết hợp (bind) SQL* Plus Viết khối PL/ SQL để chèn hàng... kiểu liệu với cột table/view Ví dụ: emprec employees_temp%ROWTYPE; V Các biến kết hợp SQL* Plus SQL* Plus hỗ trợ biến kết hợp (bind variable) Đây biến dùng để gửi giá trị vào hay khối PL/ SQL ... ĐH Bách Khoa HCM CuuDuongThanCong .com https://fb .com/ tailieudientucntt Bảo Mật Hệ Thống Thông Tin – 2013 PL/ SQL Lab 03 ‘actions’ hay nhiều câu lệnh PL/ SQL hay SQL, câu kết thúc dấu chấm phẩy Các