Download as pdf or txt
Download as pdf or txt
You are on page 1of 33

1

 Giới thiệu PL/SQL.


 Khối lệnh trong PL/SQL (block)
 Biến và hằng số
 Lệnh nhập/xuất
 Các cấu trúc điều khiển
 Xử lý ngoại lệ (Exception)
 Cursors
 Function, Procedure, Trigger, Package

2
 SQL: Structure Query Language
 PL/SQL: Procedural Language extensions for SQL

 Điểm mạnh của PL/SQL:


– Tích hợp cấu trúc hướng thủ tục vào SQL
– Tăng hiệu năng xử lý
– Module hóa chương trình
– Có cơ chế xử lý ngoại lệ

3
4
 Quy tắc đặt tên biến
 Khai báo biến và hằng
 Gán giá trị cho biến

5
 Bắt đầu bằng chữ cái
 Có thể chứa cả số và chữ cái
 Có thể chứa kí tự đặc biệt: dấu $, gạch dưới, … (hạn chế dùng $)
 Tối đa 30 kí tự
 Không trùng với từ khóa mà Oracle sử dụng, vídụ: varchar, table…

6
 Đặt trong phần DECLARE
 Khai báo biến

 Ví dụ

7
 Gán trực tiếp:

 Gán gián tiếp:

8
9
 Dùng để khai báo một biến mà nó tham chiếu đến một cột trong cơ sở dữ liệu
(Có cấu trúc như một cột trong Table).
 Ví dụ: khai báo biến v_Manv có cùng kiểu dữ liệu với cột Manv trong bảng
NHANVIEN
v_Manv NHANVIEN.Manv%TYPE
 Khai báo có điểm thuận lợi là: kiểu dữ liệu chính xác của biến v_Manv không
cần được biết, nếu định nghĩa của cột Manv trong bảng NHANVIEN bị thay đổi
thì kiểu dữ liệu của biến v_Manv thay đổi tương ứng.

10
 Dùng để khai báo một biến mà nó tham chiếu đến một dòng trong
cơ sở dữ liệu (Có cấu trúc như một dòng trong Table).
Ví dụ: khai báo biến v_nv có kiểu dữ liệu là một dòng trong bảng
NHANVIEN
v_nv NHANVIEN%ROWTYPE
 Khi truy xuất đến từng cột ta sử dụng giống như một bảng dữ liệu
(trong trường hợp này chỉ gồm 1 record) tham chiếu đến một cột.
Cú pháp: Tên-biến.Tên-cột
VD: v_nv.HoTen

11
 LỆNH XUẤT:
Cú pháp: DBMS_OUTPUT.PUT_LINE (‘Nội dung');
Lưu ý: trước khi thực hiện lệnh xuất ta phải chạy lệnh sau
SET SERVEROUTPUT ON;
 LỆNH NHẬP:
◦ Biến thay thế &:
 dấu & đặt trước biến.
 Biến được nhập giá trị lúc thực thi câu SQL.
◦ Biến thay thế &&:
 dấu && đặt trước biến.
 Giá trị nhập vào được lưu trữ cho những lần sau.

12
SET SERVEROUTPUT ON;
DECLARE
X number;
BEGIN
X:=&X;
DBMS_OUTPUT.PUT(‘Gia tri X= ’);
DBMS_OUTPUT.PUT_LINE(X);
END

13
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;

14
declare
z emp%rowtype;
begin
select * into z from emp where empno='7369';
dbms_output.put_line('Ma nv:' || z.empno || ' - Ho ten nhan vien:' || z.ename);
end;

15
16
17
18
19
20
21
22
23
24
 Khi một lỗi phát sinh, một ngoại lệ được đưa ra, việc thực hiện chương trình bình
thường được dừng lại và điều khiển được chuyển tới khối PL/SQL chứa phần
xử lý ngoại lệ.
 Có 2 dạng ngoại lệ (exception)
◦ Ngoại lệ không tường minh (implicit): là những ngoại lệ bên trong được sinh ra một
cách tiềm ẩn
VD: Nếu chia một số cho zero, một ngoại lệ do Oracle định nghĩa trước (ví dụ:
ZERO_DIVIDE) sẽ tự động sinh ra.
◦ Ngoại lệ tường minh (explicit): là ngoại lệ do người dùng định nghĩa bằng cách sử
dụng câu lệnh RAISE

https://docs.oracle.com/cd/B10501_01/ap
pdev.920/a96624/07_errs.htm
25
DECLARE
/*nếu là Block ngoài cùng của Function hoặc Procedure thì không dùng Declare*/
loi_ngoai_le EXCEPTION;
….
BEGIN
….
IF <điều kiện lỗi> then
RAISE loi_ngoai_le; /*bật ngoại lệ*/
END IF ;
EXCEPTION
WHEN loi_ngoai_le then
…..
WHEN OTHERS then
….
END;

26
 Ví dụ: Xây dựng hàm Test_Exception, trả về 1 nếu trùng mã số, trả về 2: bình thường

Create Function Test_Exception (maso number) return number As


trung_ma_so EXCEPTION; /*khai bao 1 ngoai le ten “trung_ma_so”*/
BEGIN
IF maso=5 then
RAISE trung_ma_so; /* bat ngoai le bang tu khoa RAISE*/
ELSE
return 2;
END IF;
EXCEPTION
WHEN trung_ma_so then
return 1; /*da co ma so nay roi*/
WHEN OTHERS then /*sử dụng từ khóa OTHERS cho các lỗi khác*/
return 0; /*loi phat sinh*/
END;
27
28
29
1. Xây dựng khối lệnh tính n giai thừa
2. Xây dựng khối lệnh in ra bảng cửu chương thứ n
3. Sử dụng bảng employees trong HR.sql, xây dựng khối lệnh
◦ Nhập vào tên nhân viên FIRST_NAME  in ra thông tin về nhân viên đó gồm:
EMPLOYEE_ID, FIRST_NAME, LAST_NAME
◦ Xử lý lỗi khi tìm không thấy nhân viên nào hoặc tìm thấy nhiều nhân viên trùng tên

30
1. Xây dựng khối lệnh tính n giai thừa

set SERVEROUTPUT ON;


declare
n number;
gt NUMBER:=1;
begin
n:=&n;
for i in 1..n loop
gt:=gt*i;
end loop;
dbms_output.put_line('n!= ' || gt);
end;

31
2. Xây dựng khối lệnh in ra bảng cửu chương thứ n

set SERVEROUTPUT ON;


declare
n number:=2;
i INTEGER:=1;
begin
n:=&n;
while i<=9 loop
dbms_output.put_line(n || 'x' || i || ' = ‘ || i*n);
i:=i+1;
end loop;
end;

32
3. Sử dụng bảng employees trong HR.sql, xây dựng khối lệnh
◦ Nhập vào tên nhân viên FIRST_NAME  in ra thông tin về nhân viên đó gồm:
EMPLOYEE_ID, FIRST_NAME, LAST_NAME,
◦ Xử lý lỗi khi tìm không thấy nhân viên nào hoặc tìm thấy nhiều nhân viên trùng tên
set SERVEROUTPUT ON;
declare
ename employees.first_name%TYPE;
emp employees%rowtype;
begin
ename:='&ename';
Select * into emp from EMPLOYEES where FIRST_NAME=ename;
dbms_output.put_line(emp.EMPLOYEE_ID||' '|| emp.FIRST_NAME || ' '|| emp.LAST_NAME);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('Không tìm thấy');
WHEN too_many_rows THEN
dbms_output.put_line('Trùng tên');
WHEN others THEN
dbms_output.put_line('Lỗi');
end;
33

You might also like