1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng cơ sở dữ liệu oracle chương 3 GV dương khai phong

61 227 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 61
Dung lượng 768,37 KB

Nội dung

Trường Đại học Công nghệ thông tin Bộ môn Hệ thống thông tin Môn học: Hệ quản trị CSDL Oracle GV: Dương Khai Phong Email: khaiphong@gmail.com Nội dung môn học: Giới thiệu Oracle Các công cụ Oracle • Cơng cụ Enterprise Manager (EM) • Cơng cụ SQL Plus • Cơng cụ iSQLPlus Ngơn ngữ SQL Ngôn ngữ thủ tục PL/SQL Kiến trúc quản trị Oracle Phần 4: NGÔN NGỮ THỦ TỤC PL/SQL 1/ GIỚI THIỆU PL/SQL    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 Ngôn ngữ thủ tục PL/SQL (Procedural Language/SQL) Oracle dùng để xây dựng ứng dụng 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 2/ CẤU TRÚC PL/SQL DECLARE /*Phần Khai báo biến Block 1*/ - Block Các khai báo biến Block (Declarations) BEGIN Các câu lệnh thực (Executable Statements) DECLARE /*Phần Khai báo biến Block 2*/ - Block Các khai báo biến Block (Declarations) BEGIN 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 3/ KHAI BÁO BIẾN VÀ HẰNG  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 như: 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 3/ KHAI BÁO BIẾN, HẰNG VÀ XUẤT/NHẬP  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; 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 3/ KHAI BÁO BIẾN, HẰNG VÀ XUẤT/NHẬP (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 3/ KHAI BÁO BIẾN, HẰNG VÀ XUẤT/NHẬP (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 3/ KHAI BÁO BIẾN, HẰNG VÀ XUẤT/NHẬP XUẤT/NHẬP TRONG PL/SQL  LỆNH XUẤT: Cú pháp: DBMS_OUTPUT.PUT_LINE (‘Nội dung'); Lưu ý: trước thực lệnh xuất ta phải chạy lệnh sau SET SERVEROUTPUT ON  LỆNH NHẬP: Trong ORACLE, ta có cách để nhập giá trị cho biến  Biến thay &: dấu & đặt trước biến Biến nhập giá trị lúc thực thi câu SQL Khi chạy lệnh SQL môi trường SQL*Plus dòng chữ -> nhập giá trị vào - Lưu ý: biến kiểu chuỗi, kiểu ngày đặt cặp dấu ‘ ’  Biến thay &&: dấu && đặt trước biến Giá trị nhập vào lưu trữ cho lần sau 10 6/ SỬ DỤNG CON TRỎ (CURSOR) – Con trỏ tường minh – Ví dụ Create Procedure Hien_Thi_Muc_Luong as x EMP.empno%TYPE; y EMP.sal%TYPE; cursor nv is select empno, sal from emp; begin open nv; DBMS_OUTPUT.Put ('Ma nhan vien '); DBMS_OUTPUT.Put ('Muc luong'); loop DBMS_OUTPUT.new_line; fetch nv into x, y; exit when nv%NotFound; DBMS_OUTPUT.Put (x); DBMS_OUTPUT.Put (' DBMS_OUTPUT.Put (y); end loop; DBMS_OUTPUT.new_line; DBMS_OUTPUT.Put ('So records:'); DBMS_OUTPUT.Put (nv%ROWCOUNT); DBMS_OUTPUT.new_line; close nv; end; '); 47 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo hàm (FUNCTION) Khai báo Hàm (Function)  Hàm chương trình có trả giá trị Hàm thủ tục giống nhau, khác chỗ hàm có mệnh đề RETURN  Cú pháp: CREATE [OR REPLACE] FUNCTION tên-hàm [(argument1 [, argument2,…])] RETURN datatype IS [khai báo biến] BEGIN [EXCEPTION ] END; /*kết thúc hàm*/ 48 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo hàm (FUNCTION)     Datatype Number, Char Varchar2,… Từ khóa OR REPLACE để tự động xóa tạo hàm tên hàm tồn - Ví dụ: CREATE OR REPLACE Hien_Thi_Ngay (m number) RETURN VARCHAR IS … Không dùng Varchar2(n) trị trả (RETURN) lẫn đối số truyền vào (argument), kiểu liệu đối số truyền vào trị trả phải kiểu liệu không ràng buộc Argument thay bởi: tên-đối-số-truyền-vào [IN | OUT | IN OUT] kiểu-dữ-liệu [{ := | DEFAULT value}] 49 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo hàm (FUNCTION) – Ví dụ CREATE FUNCTION Hien_Thi_Ngay (n NUMBER) RETURN CHAR 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; RETURN ngay; END; 50 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo hàm (FUNCTION) –Gọi hàm Gọi hàm PL/SQL: - Đầu tiên khai báo biến có kiểu liệu trùng với kiểu liệu trị trả hàm Thực lệnh sau: - Ví dụ: Declare x CHAR(20); BEGIN x:=Hien_Thi_Ngay(3); /*Tổng quát: biến:=Tên-hàm(danh sách đối số);*/ … END;  Lệnh xóa hàm: DROP FUNCTION tên-hàm;  51 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo thủ tục (PROCEDURE)   Thủ tục chương trình để thực hành động cụ thể Hàm thủ tục giống nhau, khác chỗ hàm có mệnh đề RETURN Cú pháp: CREATE [OR REPLACE] PROCEDURE tên-thủ tục [(parameter1 [, parameter2,…])] IS [khai báo biến] BEGIN a [EXCEPTION ] END; /*kết thúc thủ tục*/ 52 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo thủ tục (PROCEDURE)    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}] 53 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo thủ tục (PROCEDURE)- 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; 54 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo thủ tục (PROCEDURE)- Gọi thủ tục 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;  55 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo thủ tục (PROCEDURE)- Ví dụ 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 56 nv 7789 SQL> Exec Insert_EMP (‘7789', ‘Nguyen Van A','2 Feb 2006', '7788',1000) ;  thêm 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo ràng buộc (TRIGGER) Khai báo ràng buộc (Trigger)  Trigger dùng để khai báo ràng buộc tồn vẹn phức tạp mà khơng thể khai báo cấp talbe ràng buộc NOT NULL, UNIQUE, PRIMARY KEY, CHECK  Cú pháp: CREATE [OR REPLACE] TRIGGER tên-trigger BEFORE|AFTER INSERT|DELETE|UPDATE ON tên-Table [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 57 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo ràng buộc (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 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 58 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo ràng buộc (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 59 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo ràng buộc (TRIGGER)   Thao tác trigger: DISABLE ENABLE:  Lệnh disable trigger 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; 60 7/ KHAI BÁO HÀM, THỦ TỤC VÀ RÀNG BUỘC – Khai báo ràng buộc (TRIGGER) Create Trigger Tang_Bonus AFTER INSERT ON emp :new: bảng tạm dùng để lưu liệu tạm thời FOR EACH ROW giao tác Insert declare thực v_sal EMP.SAL%TYPE; :old: bảng tạm dùng để Begin lưu liệu tạm thời if :new.SAL IS NOT NULL then giao tác /*trich 10% luong cua nguoi moi vao*/ Update,Delete thực 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) 61 ... đến Cơ sở liệu Oracle lại chưa đăng nhập vào Cơ sở liệu Một số lỗi chương trình, ví dụ hàm (function) khơng chứa mệnh đề RETURN để trả giá trị Lỗi nhớ TIMEOUT_ON_RESOURCE Lỗi timeout xảy Oracle. .. trỏ - Phần khai báo phải đặt vùng khai báo biến (trước BEGIN khối (Block)) - 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... môn học: Giới thiệu Oracle Các cơng cụ Oracle • Cơng cụ Enterprise Manager (EM) • Cơng cụ SQL Plus • Cơng cụ iSQLPlus Ngôn ngữ SQL Ngôn ngữ thủ tục PL/SQL Kiến trúc quản trị Oracle Phần 4: NGÔN

Ngày đăng: 03/12/2015, 13:12

TỪ KHÓA LIÊN QUAN