Bài th c hành s 4
PL/SQL (1)
Tóm t t n i dung:
Khái ni m PL/SQL
Các v n đ liên quan đn ki u d li u trong PL/SQL ế
H ng và Bi n ế
C u trúc kh i PL/SQL
Các câu l nh đi u khi n
I. PL/SQL là gì ?
PL/SQL (PL : Procedural Language Ngôn ng Th t c) là m t m r ng c a SQL, k t h p ế
vào trong đó r t nhi u đc tính c a các ngôn ng l p trình g n đây. Nó cho phép các thao tác
d li u và các câu l nh query SQL bao g m các đo n mã có c u trúc kh i và tính th t c
(block-structure and procedural unit of code), làm cho PL/SQL thành m t ngôn ng x lý giao
d ch m nh m .
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
II. Các l nh SQL trong PL/SQL
PL/SQL cung c p m t s câu l nh th t c cho vi c thao tác và ki m tra d li u, th ng ườ
không c n ph i dính dáng v i các l nh SQL. Dù v y, khi c n l y th ng tin t CSDL
ho c thay đi trên CSDL thì nên dùng SQL.
PL/SQL h tr t t cho đa s các l nh DML và các l nh đi u khi n giao d ch trong SQL.
Ngoài ra, các câu l nh SELECT có th dùng đ gán các giá tr query t 1 hàng trong b ng
cho các bi n.ế
M t s đi m l u ý: ư
M t kh i PL/SQL không ph i là m t đn v giao d ch (transaction unit) các l nh ơ
COMMIT và ROLLBACK là đc l p v i các kh i nh ng có th n m trong nó. ư
M i câu l nh SQL c n ph i k t thúc b i d u ch m ph y. ế
Câu l nh SELECT có th dùng đ gán các giá tr query t 1 hàng trong b ng cho các
bi n.ế
Các câu l nh SELECT mà không tr l i đúng m t hàng s gây ra m t l i c n ph i
gi i quy t (th ng là ph i dùng ph ng pháp x lý ngo i l ho c cursor). ế ườ ươ
Các l nh DDL không dùng đc trong PL/SQL. Ví d : ượ
-T t c các l nh b t đu b ng ALTER, CREATE, DROP, FLASHBACK
-Các l nh qu n lý quy n: GRANT, REVOKE
-Các l nh audit: AUDIT, NOAUDIT
(và còn nhi u l nh khác)
Các l nh DML có th x lý nhi u hàng (multiple rows).
III. Ki u d li u
PL/SQL h tr r t nhi u ki u d li u đ có th khai báo các bi n và các h ng. Có th ế
gán m t giá tr ban đu cho các bi n khi khai báo bi n và có th thay đi các giá tr c a ế ế
chúng thông qua các phát bi u gán v sau trong kh i. Các h ng là các danh hi u
(identifier) l u gi m t giá tr c đnh và giá tr này ph i đc gán cho h ng khi h ngư ượ
đc khai báo.ượ
Các ki u d li u:
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
D li u s : NUMBER
Ví d : NUMBER(7,2)
Nghĩa là có 7 ký s trong đó có 2 ký s sau d u th p phân. N u ta không khai báo đ ế
chính xác là 2 nh câu l nh trên thì đ chính xác m c đnh là 38 ký s .ư
D li u lu n lí: BOOLEAN
D li u ngày tháng: DATE
D li u chu i:
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
VARCHAR2 L u tr các d li u ký t có chi u dài thay đi. Chi u dài m cư
đnh là 1 ký t . Chi u dài t i đa là 32767. Ví d : VARCHAR2(30)
CHAR PL/SQL Version 1: gi ng nh VARCHAR2 nh ng chi u dài ư ư
t i đa là 255.
PL/SQL Version 2: chu i các ký t chi u dài c đnh dài t i đa
là 32767 byte. Khi so sánh hai chu i v i nhau thì các ký t
tr ng s đc thêm vào. ượ
Chú ý: Khi so sánh 2 chu i CHAR trong PL/SQL Version 1 thì
hai chu i này không đc thêm vào các ký t tr ng, ví d m t ượ
bi n ki u CHAR ch a ‘FRED’ thì khác v i m t bi n ki uế ế
CHAR ch a ‘FRED ’.
IV. Khai báo bi n và h ngế
1. Khai báo các bi nế
Các bi n PL/SQL có th đc khai báo và có th đc gán m t giá trế ượ ượ
ban đu trong ph n DECLARE c a kh i. Các bi n khác đc tham kh o đn trong ế ượ ế
ph n khai báo thì chúng ph i đc khai báo trong m t phát bi u tr c đó. ượ ướ
Cú pháp:
identifier datatype [(precision, scale)] [NOT NULL] [ := expression];
trong đó
identifier - tên bi nế
datatype - ki u d li u c a bi n ế
precision - chi u dài c a bi n (s ký s c a ph n nguyên và ph n th p ế
phân)
scale - s s l (s ký s c a ph n th p phân)
N u không gán giá tr ban đu cho bi n thì bi n s ch a giá tr NULLế ế ế
cho đn khi gán giá tr m i. Ràng bu c NOT NULL không đc dùng trong tr ngế ượ ườ
h p này.
Ví d :
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
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 tại 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 c a bi n trùng tên v i các tên c t c a b ng đc ế ượ
dùng trong kh i. N u các bi n trong các phát bi u SQL có cùng tên v i tên c t, thì ế ế
Oracle xem tên này là tên c t (mà không ph i là 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;
2. Khai báo h ng
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;
Chú ý: Có th dung t khóa %TYPE đ dùng cùng ki u v i c t đc ượ
ch đnh trong 1 table. Ví d : bi n product_type s có cùng ki u v i c t price c aế
b ng products:
product_price products.price%TYPE;
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM