Tài liệu Hệ quản trị CDSL ORACLE - Chương 2: Ngôn ngữ thủ tục PL/SQL pdf

72 2.4K 7
Tài liệu Hệ quản trị CDSL ORACLE - Chương 2: Ngôn ngữ thủ tục PL/SQL pdf

Đ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

Giảng viên: Ths Nguyễn Thị Kim Phụng - Đại học CNTT HỆ QUẢN TRỊ CSDL ORACLE CHƯƠNG KHOA HỆ THỐNG THƠNG TIN Chương 2: Ngơn ngữ thủ tục PL/SQL Giới thiệu PL/SQL Khối lệnh PL/SQL (block), Khai báo biến số, kiểu liệu Các lệnh điều kiện (IF, CASE), rẻ nhánh (GOTO), lệnh lặp (while…loop, for…loop) Xử lý ngoại lệ (Exception) Oracle Cursors: định nghĩa, phân loại cursor: tường minh tiềm ẩn, cách sử dụng Function, Procedure, Trigger, Package Giới thiệu PL/SQL (1) - (Procedural Language/Structure Query Language)    Ngôn ngữ thủ tục Oracle, dùng để xây dựng ứng dụng PL/SQL kết hợp SQL cấu trúc điều khiển, thủ tục (function), thao tác trỏ (cursor), xử lý ngoại lệ (exception) lệnh giao tác PL/SQL cho phép sử dụng tất lệnh thao tác liệu gồm INSERT, DELETE, UPDATE SELECT, COMMIT, ROLLBACK, SAVEPOINT, cấu trúc điều khiển vòng lặp (for, while, loop), rẽ nhánh (if),…mà với SQL không làm Giới thiệu PL/SQL (2) - (Procedural Language/Structure Query Language)     PL/SQL thêm chức vào công cụ không thủ tục SQL*Forms SQL*Report Các lệnh PL/SQL chia thành nhiều khối lệnh hợp lý (Block), khối lệnh lồng Các biến khai báo nội (local) bên block điều khiển báo lỗi (exception) xử lý block nơi lỗi phát sinh Một block bao gồm ba phần: phần khai báo nơi để khai báo biến, phần thi hành lệnh phần xử lý ngoại lệ (điều kiện lỗi cảnh báo) Khai báo biến PROCEDURE hay FUNCTION: Block ngồi (đầu tiên) PROCEDURE, FUNCTION khơng dùng từ khóa DECLARE (Ngược lại với TRIGGER, Block ngồi (đầu tiên) phải có DECLARE) Cấu trúc PL/SQL DECLARE BEGIN /*Phần Khai báo biến Block 1*/ - Block Các khai báo biến Block (Declarations) Các câu lệnh thực (Executable Statements) DECLARE BEGIN /*Phần Khai báo biến Block 2*/ - Block Các khai báo biến Block (Declarations) Các câu lệnh thực (Executable Statements) EXCEPTION Các xử lý ngoại lệ (Exception Handlers) /*làm lỗi xuất bên Block 2*/ END; - End Block EXCEPTION Các xử lý ngoại lệ (Exception Handlers) END; - End Block Khai báo biến (1) - Khai báo biến: mucluong NUMBER(5); - Khai báo hằng: heso CONSTANT NUMBER(3,2) := 1.86; - Với kiểu liệu Oracle NUMBER, CHAR, VARCHAR2, DATE, LONG,…hoặc PL/SQL cho phép BOOLEAN Ghi chú: Ký hiệu := sử dụng toán tử gán Khai báo biến (2) - Gán biến biểu thức: biến := biểu thức; Ví dụ: x:=UPPER('Nguyen'); y:=100; mucluong:= mucluong + mucluong*10/100; Ví dụ: kq BOOLEAN;//ko có column kiểu boolean, có kiểu liệu Boolean PL/SQL kq:= mucluong>3500000; - Độ ưu tiên toán tử: ** (phép lũy thừa), NOT, *, /, +, -, || (phép nối chuỗi), =, !=, , =, IS NULL, LIKE, BETWEEN, IN, AND, OR Khai báo biến (3) (Các thuộc tính %TYPE %ROWTYPE) Thuộc tính %TYPE  Dùng để khai báo biến mà tham chiếu đến cột sở liệu (Có cấu trúc cột Table) Ví dụ: khai báo biến v_Manv có kiểu liệu với cột Manv bảng NHANVIEN v_Manv NHANVIEN.Manv%TYPE  Khai báo có điểm thuận lợi là: kiểu liệu xác biến v_Manv không cần biết, định nghĩa cột Manv bảng NHANVIEN bị thay đổi kiểu liệu biến v_Manv thay đổi tương ứng Khai báo biến (4) Ví dụ thuộc tính %TYPE declare x emp.empno%type; y emp.ename%type; begin select empno, ename into x,y from emp where empno='7369'; dbms_output.put_line('Ma nv:' || x || ' - Ho ten nhan vien:' || y); end; Chạy lệnh SET SERVEROUTPUT ON SQL*Plus trước Lúc lệnh DBMS_OUTPUT.PUT_LINE…mới có hiệu lực in text “…….” hình Khai báo biến (5) (Các thuộc tính %TYPE %ROWTYPE) Thuộc tính %ROWTYPE  Dùng để khai báo biến mà tham chiếu đến dòng sở liệu (Có cấu trúc dịng Table) Ví dụ: khai báo biến v_nv có kiểu liệu dòng bảng NHANVIEN v_nv NHANVIEN%ROWTYPE  Khi truy xuất đến cột ta sử dụng giống bảng liệu (trong trường hợp gồm record) tham chiếu đến cột Cú pháp: Tên-biến.Tên-cột VD: v_nv.HoTen 10 Khai báo hàm, thủ tục ràng buộc (6) (Function, Procedure, Trigger)    Từ khóa OR REPLACE để tự động xóa tạo thủ tuc tên thủ tục tồn - Ví dụ: CREATE OR REPLACE Hien_Thi_Ngay (m number) IS … Không dùng Varchar2(n) tham số truyền vào (parameter), kiểu liệu tham số truyền vào phải kiểu liệu không ràng buộc Parameter thay bởi: tên-tham-số-truyền-vào [IN | OUT | IN OUT] kiểu-dữliệu [{ := | DEFAULT value}] 58 7* Khai báo hàm, thủ tục ràng buộc (7)  (Function, Procedure, Trigger) Ví dụ: CREATE PROCEDURE Hien_Thi_Ngay (n NUMBER) IS CHAR(15); BEGIN IF n =1 THEN :='Sunday'; ELSIF n =2 THEN :='Monday'; ELSIF n =3 THEN :='Tuesday'; ELSIF n =4 THEN :='Wednesday'; ELSIF n =5 THEN :='Thursday'; ELSIF n =6 THEN :='Friday'; ELSIF n =7 THEN :='Saturday'; END IF; END; /* tương tự chạy Procedure với tham số OUT, IN OUT*/ 59 Khai báo hàm, thủ tục ràng buộc (8) (Function, Procedure, Trigger) Gọi thủ tục PL/SQL: - Ví dụ: Declare … BEGIN Hien_Thi_Ngay(3); /*Tổng quát: Tên-hàm(danh sách tham số);*/ … END;  Gọi thủ tục từ SQL*Plus: SQL> EXECUTE Hien_Thi_Ngay(6)  Cú pháp xóa thủ tục: DROP PROCEDURE tên-thủ-tục; 60  7* Khai báo hàm, thủ tục ràng buộc (9) (Function, Procedure, Trigger) Create Procedure Insert_EMP (v_EMPNO in varchar2, v_ENAME in varchar2, v_HIREDATE in date, v_MGR in varchar2, v_SAL in varchar2) As emp_cnt int; Begin select count(*) into emp_cnt from EMP where EMPNO = v_EMPNO; if ( emp_cnt=1) then DBMS_Output.Put_line('Trung khoa chinh');/*tru`ng khoa chinh */ else savepoint Point_1; insert into EMP (EMPNO, ENAME,HIREDATE, MGR, SAL) values (v_EMPNO, v_ENAME,v_HIREDATE,v_MGR, v_SAL) ; if SQL%ROWCOUNT = then DBMS_Output.Put_line('Xay loi giao tac'); /*loi khac*/ ROLLBACK to savepoint Point_1; end if; DBMS_Output.Put_line('Them nhan vien cong') ; COMMIT ; end if; end; Ghi chú: Chạy lệnh sau SQL*Plus để thấy kết xử lý trường hợp SQL> Exec Insert_EMP (‘7788', ‘Nguyen Van A','2 Feb 2006', '7788',1000) ;  trùng khóa 7788 SQL> Exec Insert_EMP (‘7789', ‘Nguyen Van A','2 Feb 2006', '7788',1000) ;  thêm nv 7789 61 7*.Ví dụ: Procedure sử dụng tham số IN, OUT CREATE PROCEDURE P_Ngay (n IN NUMBER,m OUT NUMBER) IS CHAR(15); BEGIN IF n =1 THEN :='Sunday'; ELSIF n =2 THEN :='Monday'; ELSIF n =3 THEN :='Tuesday'; ELSIF n =4 THEN :='Wednesday'; ELSIF n =5 THEN :='Thursday'; ELSIF n =6 THEN :='Friday'; ELSIF n =7 THEN :='Saturday'; END IF; m:=n; dbms_output.put_line('Ngay truyen vao:' || ngay); END; 62 7*.Ví dụ: Procedure sử dụng tham số IN, OUT (tt) declare m number; begin P_Ngay(5,m); dbms_output.put_line('Tham so ra:' || m); end; declare a number; b number; begin a:=4; P_Ngay(a,b); dbms_output.put_line(a); dbms_output.put_line(b); end; Chạy TH iSQL*Plus để thấy kết xử lý cho nhận xét??? declare m number; begin m:=7; P_Ngay(5,m); dbms_output.put_line('Tham so ra:' || m); end; declare m number; begin P_Ngay(5,7); /* cho nhan xet???? */ dbms_output.put_line('Tham so ra:'); end; 63 Khai báo hàm, thủ tục ràng buộc (10) (Function, Procedure, Trigger) Khai báo ràng buộc (Trigger)  Trigger dùng để khai báo ràng buộc toàn vẹn phức tạp mà khai báo cấp talbe ràng buộc NOT NULL, UNIQUE, PRIMARY KEY, CHECK Cú pháp: CREATE [REPLACE] TRIGGER tên-trigger BEFORE|AFTER INSERT/DELETE/UPDATE ON tên-Table [REFERENCING [NEW AS ] [OLD AS ]] [FOR EACH ROW] DECLARE /*Tùy thuộc tốn có khai báo biến hay ko*/ [khai báo biến] WHEN Block-của-PL/SQL  64 Khai báo hàm, thủ tục ràng buộc (11) (Function, Procedure, Trigger)    Từ khóa REPLACE để tự động xóa tạo trigger trigger tồn Ví dụ: REPLACE TRIGGER Tên-Trigger table_name để đến tên table muốn tạo trigger NEW giá trị dòng insert/update, OLD giá trị dịng xóa (delete) Note: In the trigger body, NEW and OLD must be preceded by a colon (":"), but in the WHEN clause, they not have a preceding colon!    INSERT | DELETE | UPDATE ứng với kiện tác động lên table để trigger tự động thi hành kiện xảy AFTER database trigger thi hành sau thực kiện BEFORE để khai báo trigger thi hành trước thi hành kiện Tùy chọn FOR EACH ROW để trigger thi hành câu lệnh SQL tác động lên dòng 65 Khai báo hàm, thủ tục ràng buộc (12) (Function, Procedure, Trigger) Chú ý tạo trigger:     Phần thân trigger chứa lệnh DML, lệnh SELECT phải SELECT INTO ngoại trừ lệnh SELECT khai báo cursor DDL không dùng phần thân trigger Không cho phép lệnh quản lý giao tác (COMMIT, ROLLBACK, SAVEPOINT) phần thân trigger Nếu trigger gọi chương trình chương trình khơng chứa lệnh quản lý giao tác 66 Khai báo hàm, thủ tục ràng buộc (13) (Function, Procedure, Trigger) Thao tác trigger: DISABLE ENABLE  ALTER TRIGGER tên-trigger DISABLE; Để disable tất trigger liên quan đến table cụ thể, dùng lệnh: ALTER TABLE table_name DISABLE ALL TRIGGERS;  Lệnh enable trigger ALTER TRIGGER trigger_name ENABLE;  Để enable tất trigger liên quan đến table cụ thể, dùng lệnh: ALTER TABLE table_name ENABLE ALL TRIGGERS;  Cú pháp xóa trigger: DROP TRIGGER Tên-trigger; 67 7* Khai báo hàm, thủ tục ràng buộc (14) (Function, Procedure, Trigger) Create Trigger Tang_Bonus AFTER INSERT ON emp FOR EACH ROW declare v_sal EMP.SAL%TYPE; Begin if :new.SAL IS NOT NULL then /*trich 10% luong cua nguoi moi vao*/ /*Note: In the trigger body, NEW and OLD must be preceded by a colon (":"), but in the WHEN clause, they not have a preceding colon! */ v_sal:= :new.Sal*10/100; /*bonus cho nguoi quan ly = 10% luong nguoi moi vao*/ insert into BONUS (empno, sal) values (:new.MGR,v_sal) ; End if; End; Ghi chú: Trước tạo Trigger, mở bảng BONUS user SCOTT sửa lại cột Ename thành Empno đổi kiểu liệu tương ứng Chạy lệnh sau: SQL> Exec Insert_EMP (‘7790', ‘Nguyen Van B','2 Feb 2006', '7788',1000) ;  thêm nhân viên ràng buộc thực  kết nhân viên 7788 thêm bonus 100 (table BONUS) 68 7* Khai báo hàm, thủ tục ràng buộc (15) (Function, Procedure, Trigger) Aborting Triggers with Error The WHEN clause or body of the trigger can check for the violation of certain conditions and signal an error accordingly using the Oracle built-in function RAISE_APPLICATION_ERROR The action that activated the trigger (insert, update, or delete) would be aborted For example, the following trigger enforces the constraint Person.age >= 0: create table Person (age int); CREATE TRIGGER PersonCheckAge AFTER INSERT OR UPDATE OF age ON Person FOR EACH ROW BEGIN IF (:new.age < 0) THEN RAISE_APPLICATION_ERROR(-20000, 'no negative age allowed'); END IF; END; 69 7*     Trigger: Mutating Trigger (1) Mutating Table Errors Sometimes you may find that Oracle reports a "mutating table error" when your trigger executes This happens when the trigger is querying or modifying a "mutating table", which is either the table whose modification activated the trigger, or a table that might need to be updated because of a foreign key constraint with a CASCADE policy To avoid mutating table errors: * A row-level trigger must not query or modify a mutating table (Of course, NEW and OLD still can be accessed by the trigger.) * A statement-level trigger must not query or modify a mutating table if the trigger is fired as the result of a CASCADE delete 70 7* Trigger: Mutating Trigger (2) Mutating Trigger Demo The insert into t1 firest the trigger which attempts to count the number of records in t1 which is ambiguous CREATE TABLE t1 (x int); CREATE TABLE t2 (x int); INSERT INTO t1 VALUES (1); CREATE OR REPLACE TRIGGER t_trigger AFTER INSERT ON t1 FOR EACH ROW DECLARE i INTEGER; BEGIN SELECT COUNT(*) INTO i FROM t1; INSERT INTO t2 VALUES (i); END; Tạo trigger, sau chạy lệnh INSERT INTO t1 VALUES (2); cho nhận xét??? 71 7* Trigger: Mutating Trigger (3) Fix Mutating Trigger With Autonomous Transaction Count on t1 is performed as though a different user logged on and asked the question of t1 CREATE OR REPLACE TRIGGER t_trigger AFTER INSERT ON t1 FOR EACH ROW DECLARE PRAGMA AUTONOMOUS_TRANSACTION; i INTEGER; BEGIN SELECT COUNT(*) INTO i FROM t1; INSERT INTO t2 VALUES (i); COMMIT; END; Sửa lại Trigger trên, chạy lệnh INSERT INTO t1 VALUES (2); cho nhận xét??? SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t2; 72 ... Trong ngôn ngữ thủ tục PLSQL, để xử lý liệu lưu sở liệu, liệu cần ghi vào biến Giá trị biến thao tác Dữ liệu bảng tham khảo trực tiếp - 36 Sử dụng trỏ PL/SQL (4) Khai báo cursor (Khai báo trỏ) - -. . .Chương 2: Ngôn ngữ thủ tục PL/SQL Giới thiệu PL/SQL Khối lệnh PL/SQL (block), Khai báo biến số, kiểu liệu Các lệnh điều kiện (IF, CASE), rẻ nhánh... END; 17 Các cấu trúc (lệnh) điều khiển (7) Lệnh lặp FOR…LOOP  Cú pháp: FOR biến-chạy IN giá -tr? ?- khởi-tạo giá -tr? ?- kết-thúc LOOP END LOOP; 18 Các cấu trúc (lệnh) điều khiển (8)  Ví dụ:

Ngày đăng: 16/02/2014, 08:20

Từ khóa liên quan

Mục lục

  • PowerPoint Presentation

  • Slide 2

  • Slide 3

  • Slide 4

  • Slide 5

  • Slide 6

  • Slide 7

  • Slide 8

  • Slide 9

  • Slide 10

  • Slide 11

  • Slide 12

  • Slide 13

  • Slide 14

  • Slide 15

  • Slide 16

  • Slide 17

  • Slide 18

  • Slide 19

  • Slide 20

Tài liệu cùng người dùng

Tài liệu liên quan