Professional Documents
Culture Documents
1 3
2 4
1
Phép gán
5 7
Biến Toán tử
6 8
2
Các thuộc tính %TYPE, %ROWTYPE Cấu trúc lệnh IF
Cú pháp Ví dụ:
Thuộc tính %TYPE
declare
– Để khai báo 1 biến có cùng KDL với 1 cột trong IF <điều kiện> THEN v_num number(2);
Các lệnh của if begin
table. v_num:=4;
– Ví dụ: s_ho sinhvien.hosv%TYPE ELSE if v_num=3 then
Các lệnh của else dbms_output.put_line('bang 3');
Thuộc tính %ROWTYPE END IF;
else
dbms_output.put_line('khong
– Để khai báo 1 biến có cùng KDL với 1 dòng trong bang 3');
table. end if;
end;
– Ví dụ: sv_rec sinhvien%TYPE
9 11
Vòng lặp
10 12
3
Xử lý ngoại lệ
13 15
14 16
4
Ví dụ: Ngoại lệ do người dùng định nghĩa
Ví dụ:
begin declare
loi exception;
insert into khoa values('kt','kinh te'); s_ho sinhvien.hosv%TYPE;
s_ten sinhvien.tensv%TYPE;
exception begin
when DUP_VAL_ON_INDEX then select hosv, tensv into s_ho,s_ten from sinhvien where masv='a01';
if s_ten != 'Mai' then
dbms_output.put_line('Trung khoa chinh'); raise loi;
end if;
when OTHERS then exception
dbms_output.put_line('Loi'); when loi then dbms_output.put_line('Khong co du lieu');
end;
end;
17 19
Để xử lý tất cả các lỗi khác mà nó không Cursor là kiểu biến có cấu trúc hay là một đối
được định nghĩa trong khối exception, ngoại tượng liên kết với một tập dữ liệu cho
lệ “OTHERS” có thể được sử dụng. phép ta xử lý dữ liệu gồm nhiều dòng. Số
dòng phụ thuộc vào câu lệnh SQL sau đó.
18 20
5
Khai báo cursor Ví dụ:
declare
CURSOR <tên> IS câu lệnh select; s_ho sinhvien.hosv%TYPE;
s_ten sinhvien.tensv%TYPE;
cursor sv is select hosv,tensv from sinhvien;
begin
Chú ý: open sv;
loop
– Lệnh khai báo trên phải được đặt trong khối fetch sv into s_ho, s_ten;
declare. exit when sv%NOTFOUND;
dbms_output.put_line(s_ho || ' ' ||s_ten);
– Khi khai báo cursor là cursor chưa được mở. end loop;
end;
21 23
Một số thao tác trên cursor: Open, Fetch, Các thuộc tính của con trỏ
Close – %NOTFOUND: Là TRUE khi fetch đến dòng cuối
– Open <tên cursor>: Mở cursor. cùng, ngược lại là FALSE.
– Close <tên cursor>: Đóng cursor.
– %FOUND: Là TRUE khi fetch cuối cùng thành
– Fetch <tên cursor> INTO biến 1,…; hoặc
công, ngược lại FALSE.
Fetch <tên cursor> INTO biến mẫu tin;
Lệnh Fetch được dùng truy lục 1 dòng trong tập – %ROWCOUNT: Trả về số dòng đã được fetch.
dữ liệu của cursor. Lệnh fetch có thể được dùng – %ISOPEN: Là TRUE nếu cursor ở trạng thái mở,
chung với LOOP để quyết tất cả các dòng dữ FALSE nếu cursor ở trạng thái đóng.
liệu.
22 24
6
Thủ tục (procedure)
25 27
26 28
7
CREATE OR REPLACE PROCEDURE update_diem
(ma IN ketqua.masv%TYPE, mon IN ketqua.mamh%TYPE,
diemmoi IN ketqua.diem%TYPE)
IS kq NUMBER(2);
BEGIN
Hàm
SELECT COUNT(*) INTO kq FROM ketqua
WHERE masv=ma AND mamh=mon; Hàm tương tự thủ tục nhưng có kết quả trả về
IF kq = 1 THEN Cú pháp tạo hàm:
UPDATE ketqua CREATE [OR REPLACE] FUNCTION tên_hàm(tham số 1,…)
SET diem = diemmoi RETURN KDL_trả_về
WHERE masv=ma AND mamh=mon; IS khai báo
COMMIT; BEGIN
END IF; Lệnh trong hàm;
EXCEPTION RETURN kết_quả_trả_về;
WHEN OTHERS THEN ROLLBACK; [EXCEPTION ngoại lệ]
END;
END;
29
31
Xóa hàm
DROP FUNCTION tên_hàm;
30
32
8
Ví dụ: Ví dụ:
CREATE OR REPLACE FUNCTION cong
(so1 NUMBER,so2 NUMBER) CREATE OR REPLACE PROCEDURE tong(so1 IN
RETURN NUMBER NUMBER,so2 IN NUMBER,kq OUT NUMBER)
IS kq NUMBER(3);
IS
BEGIN
kq:=so1 + so2; BEGIN
RETURN kq; kq:=so1 + so2;
END;
Gọi hàm: END;
dbms_output.put_line(cong(3,5));
33 35
34 36
9
Trigger
Đặc điểm của trigger Khi trigger thực thi, Oracle tạo ra 2 dòng
– Gán vào 1 table cụ thể. :new và :old
– Được gọi tự động khi cho hành động thêm, sửa – :new: Lưu dữ liệu mới được INSERT hoặc
hoặc xóa trên table. UPDATE.
– :old: Lưu dòng dữ liệu mới bị xóa.
37 39
Tạo trigger Ví dụ: Tạo trigger để kiểm tra điểm phải từ 0 đến 10
CREATE [OR REPLACE] TRIGGER tên_trigger CREATE TRIGGER kt_diem
AFTER INSERT ON ketqua
BEFORE | AFTER
FOR EACH ROW
[UPDATE (OF column)] | [DELETE] | [INSERT] BEGIN
ON TABLE IF :new.diem<=0 OR :new.diem>10 THEN
[FOR EACH ROW] raise_application_error(-20101,:new.masv);
BEGIN rollback;
END IF;
Lệnh trong trigger;
END;
END;
38 40
10
Vô hiệu hóa trigger
ALTER TRIGGER tên_trigger DISABLE;
Hiệu lực hóa trigger
ALTER TRIGGER tên_trigger ENABLE;
Disable/enable tất cả các trigger liên quan đến 1
table:
ALTER TABLE tên_bảng
DISABLE | ENABLE ALL TRIGGERS
Xóa trigger
DROP TRIGGER tên_trigger
41
Bài tập
42
11