Bài giảng CƠ SỞ DỮ LIỆU NÂNG CAO

Số tc: 2; LT: 20; Btập: 10 GV: Nguyễn Thị Mỹ Dung Khối lớp: Đại học L2

Chương 4: Lập trình PL/SQL 1

NỘI DUNG MÔN HỌC

1

Chương 1. Tổng quan CSDL phân tán (4)

Chương 2. Tổng quan CSDL hướng đối tượng

2

3

Chương 3. Cơ bản về Oracle (4)

4

Chương 4: Lập trình PL/SQL (4)

5

Chương 5: Procedure, Function (4)

6

Chương 6: Thiết kế đối tượng (6)

7 Chương 7: Truy vấn trong CSDL HĐT (4)

Chương 4: Lập trình PL/SQL 2

Chương 4: Lập trình PL/SQL

I. Cấu trúc chương trình PL/SQL II. Các kiểu dữ liệu cơ bản của PL/SQL III. Các kiểu dữ liệu tham chiếu IV. Các loại mệnh đề V. Cấu trúc điều khiển VI. Kiểu con trỏ VII. Bài tập thực hành

Chương 4: Lập trình PL/SQL 3

I. Cấu trúc chương trình PL/SQL

1. Giới thiệu PL/SQL (Procedural Language/Structured Query Language) là một ngôn ngữ lập trình lập trình hướng thủ tục sử dụng cho Oracle SQL.

PL/SQL là sự kết hợp giữa SQL và các khai báo hằng số, biến, cấu trúc điều khiển, thủ tục, hàm, bẫy lỗi sự kiện, thao tác con trỏ, và xử lý giao tác…

Mọi thứ được lưu trữ trong DB được tái sử dụng bởi các ứng dụng bất kỳ giao tiếp với ứng dụng Oracle.

Từ phiên bản 8 trở về sau có thêm các tính năng

hướng đối tượng.

Chương 4: Lập trình PL/SQL 4

Cấu trúc PL/SQL – giới thiệu(tt)

- Mỗi lệnh SQL kết thúc bằng dấu chấm phẩy (;). - PL/SQL tổ chức theo từng khối lệnh (block), mỗi khối lệnh có thể lồng nhau. Các biến có thể khai báo nội (local) bên trong khối và điều khiển báo lỗi bên trong khối nơi lỗi phát sinh.

- Một block bao gồm ba phần: phần khai báo là nơi để khai báo biến, phần thi hành lệnh và phần xử lý các ngoại lệ (điều kiện lỗi hoặc cảnh báo).

- Khai báo biến

trong PROCEDURE hay FUNCTION: nếu là Block ngoài cùng (đầu tiên) của PROCEDURE, FUNCTION thì không dùng từ khóa DECLARE (Ngược lại với TRIGGER, Block ngoài cùng (đầu tiên) phải có DECLARE).

Chương 4: Lập trình PL/SQL 5

Cấu trúc PL/SQL (tt)

2. Cấu trúc PL/SQL

--- Block 1

Các khai báo biến của Block 1 (Declarations)

BEGIN

Các câu lệnh thực hiện (Executable Statements)

--- Block 2

DECLARE /*Phần Khai báo biến Block 2*/

Các khai báo biến của Block 2 (Declarations)

BEGIN

Các câu lệnh thực hiện (Executable Statements)

EXCEPTION

Các xử lý ngoại lệ (Exception Handlers) /*làm gì nếu lỗi xuất hiện bên trong Block 2*/

END;

--- End Block 2

EXCEPTION

Các xử lý ngoại lệ (Exception Handlers)

--- End Block 1

END;

Chương 4: Lập trình PL/SQL 6

Cấu trúc PL/SQL- VD (tt)

x SINHVIEN.MASV%type; y SINHVIEN.HOTENSV%type;

Lưu ý: Chạy lệnh SET SERVEROUTPUT ON trong SQL*Plus trước. Lúc đó lệnh DBMS_OUTPUT.PUT_LINE… mới có hiệu lực in text “…….” ra màn hình

declare begin select MASV, HOTENSV into x,y from SINHVIEN where MASV='SV001'; dbms_output.put_line ('Ma SV:' || x || ' - Ho ten SV:' || y); end;

Chương 4: Lập trình PL/SQL 7

II. Kiểu dữ liệu trong PL/SQL

1. Các kiểu dữ liệu cơ bản như sau: - BINARY_INTEGER: từ -231 đến 231-1 - NUMBER [(precision, scale)]: precision<=38,

Scale: -84 đến 127

- DEC, DECIMAL, NUMERIC, DOUBLE, FLOAT:

kiểu số thực

- INTEGER, INT, SMALLINT: kiểu số nguyên có

38 chữ số.

- BOOLEAN: kiểu luận lý, có 3 giá trị True, False,

Null

Chương 4: Lập trình PL/SQL 8

Các kiểu dữ liệu cơ bản (tt)

- DATE: thế kỷ, năm, tháng, ngày, giờ, phút, giây

- CHAR (max_length): kiểu ký tự

- VARCHAR2 (max_length): max_length<=32767

- LONG: <=32760 bytes.

Chương 4: Lập trình PL/SQL 9

Kiểu dữ liệu (tt)

2. Khai báo - Khai báo biến: Diem FLOAT; - Khai báo hằng: heso CONSTANT NUMBER(3,2) := 1.86; - Với các kiểu dữ liệu trong Oracle như NUMBER, CHAR, VARCHAR2, DATE, LONG,… PL/SQL cho phép như BOOLEAN. Ghi chú: Ký hiệu := được sử dụng như là toán tử gán.

Chương 4: Lập trình PL/SQL 10

Kiểu dữ liệu - gán (tt)

- Gán biến và biểu thức: biến := biểu thức;

x := UPPER ('Nguyen'); y := 100; kinhphi := kinhphi + kinhphi * 10/100;

kq BOOLEAN; --không có column kiểu boolean, -- chỉ có kiểu dữ liệu Boolean trong PL/SQL kq := kinhphi >20;

Ví dụ: Ví dụ: - Độ ưu tiên của toán tử: ** (phép lũy thừa), NOT, *, /, +, -, || (phép nối chuỗi), =, !=, <>, <=, >=, IS NULL, LIKE, BETWEEN, IN, AND, OR.

Chương 4: Lập trình PL/SQL 11

Kiểu dữ liệu (tt)

3. Nhập xuất dữ liệu - Lệnh xuất: 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 SET SERVEROUTPUT ON

- Lệnh nhập: 2 cách để nhập giá trị cho biến

 Biến thay thế &: dấu & đặt trước biến. Biến

được nhập giá trị lúc thực thi.

 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.

Lưu ý: Biến kiểu chuỗi, kiểu ngày đặt trong cặp dấu ' ' VD: a char(5):= '&a';

Chương 4: Lập trình PL/SQL 12

Kiểu dữ liệu – Nhập xuất (tt)

x number;

Ví dụ: --SET SERVEROUTPUT ON; DECLARE BEGIN x:=&x; DBMS_OUTPUT.PUT_LINE('Gia tri x ='); DBMS_OUTPUT.PUT_LINE(x); -- DBMS_OUTPUT.PUT_LINE ('Gia tri x = '|| TO_CHAR(X)); -- END;

Chương 4: Lập trình PL/SQL 13

III. Kiểu dữ liệu tham chiếu

1. Tham chiếu kiểu %TYPE Dùng để khai báo một biến mà nó tham chiếu đến

một cột trong CSDL.

Khai báo: %TYPE

Kinhphi_nhonhat DETAI.Kinhphi%TYPE;

--SET SERVEROUTPUT ON; DECLARE BEGIN

SELECT MIN(DT.Kinhphi) INTO Kinhphi_nhonhat FROM DETAI DT; DBMS_OUTPUT.PUT_LINE(Kinhphi_nhonhat);

END;

Chương 4: Lập trình PL/SQL 14

Kiểu dữ liệu tham chiếu (tt)

2. Tham chiếu kiểu %ROWTYPE 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).

%ROWTYPE

Khai báo:

--SET SERVEROUTPUT ON; DECLARE

row_detai DETAI%ROWTYPE;

BEGIN

SELECT * INTO row_detai FROM detai WHERE MADT= 'DT001'; DBMS_OUTPUT.PUT_LINE(row_detai.MADT || ' : ' ||

row_detai.TENDT );

END;

Chương 4: Lập trình PL/SQL 15

Kiểu dữ liệu tham chiếu (tt)

3. Tham chiếu kiểu %TABLE Dùng để khai báo một biến mà nó tham chiếu đến

một bảng trong CSDL (Có cấu trúc như một Table).

Khai báo:

TYPE IS

TABLE OF [NOT NULL]

INDEX BY BINARY_INTEGER;

;

Chương 4: Lập trình PL/SQL 16

Kiểu dữ liệu tham chiếu - table(tt)

Ví dụ: --SET SERVEROUTPUT ON; DECLARE

TYPE detai_type IS TABLE OF detai%ROWTYPE INDEX BY BINARY_INTEGER; bangdt detai_type;

BEGIN

SELECT * INTO bangdt(1) FROM DETAI WHERE MADT = 'DT001 '; DBMS_OUTPUT.PUT_LINE(bangdt(1).MADT || ' : ' || bangdt(1).TENDT || ' : ' || bangdt(1).CHUNHIEM);

END;

Chương 4: Lập trình PL/SQL 17

IV. Các mệnh đề

1. Mệnh đề Select SELECT INTO [cursor_var] FROM BẢNG1, BẢNG2,.. WHERE <Điềukiện> DECLARE

vMASV SINHVIEN.MASV%TYPE;

vHOTENSV SINHVIEN.HOTENSV%TYPE;

BEGIN

SELECT MASV, HOTENSV INTO vMASV, vHOTENSV

FROM SINHVIEN WHERE MASV= ' SV002 ' ;

DBMS_OUTPUT.PUT_LINE (vMASV|| ' : ' || vHOTENSV);

END;

Chương 4: Lập trình PL/SQL 18

Các mệnh đề (tt)

2. Mệnh đề INSERT | UPDATE | DELETE

DECLARE

MAKH CHAR(2);

TENKH VARCHAR2(40);

BEGIN

MAKH := 'TT';

TENKH := 'Su pham Toan - Tin';

INSERT INTO KHOA (MAKH, TENKH)

VALUES (MAKH, TENKH);

EXCEPTION WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE (SQLERRM);

END;

Chương 4: Lập trình PL/SQL 19

V. Các cấu trúc điều khiển

1. Rẽ nhánh IF Cú pháp:

IF <điềukiện2> THEN ; ELSE …; END IF;

IF <điềukiện1> THEN ; ELSE END IF;

Chương 4: Lập trình PL/SQL 20

Cấu trúc – if (tt)

N INT; TB VARCHAR2(20);

IF MOD(N,2)=1 THEN TB := 'SO LE'; END IF;

N := &N; IF MOD(N,2)=0 THEN TB :='SO CHAN'; ELSE END IF;

VD1: Xét số n là số chẵn hay lẻ? DECLARE BEGIN DBMS_OUTPUT.PUT_LINE(TB); END;

Chương 4: Lập trình PL/SQL 21

Cấu trúc – if (tt)

n INT; ngay VARCHAR2(8);

VD2: In ngày trong tuần tương ứng với số DECLARE BEGIN

n := &n; IF n=1 THEN ngay := 'Sunday';

ELSIF n=2 THEN ngay :='Monday';

ELSIF n=3 THEN ngay :='Tuesday';

ELSIF n=4 THEN ngay :='Wedsday';

ELSIF n=5 THEN ngay :='Thursday';

ELSIF n=6 THEN ngay :=‘Friday';

ELSIF n=7 THEN ngay :=‘Saturday';

END IF;

DBMS_OUTPUT.PUT_LINE(ngay); END;

Chương 4: Lập trình PL/SQL 22

Các cấu trúc điều khiển (tt)

…. EXIT;

2. Lệnh lặp LOOP Cú pháp: LOOP IF THEN END IF; END LOOP;

Chương 4: Lập trình PL/SQL 23

Cấu trúc điều khiển - Loop(tt)

 Ví dụ:

LOOP z :=z+3; /*tính biểu thức lặp*/ DBMS_OUTPUT.PUT_LINE(z); IF (z>=100) THEN

exit;

End IF; END LOOP;

declare z number :=1; /*khởi tạo biến z*/ BEGIN /*nếu thỏa điều kiện thoát khỏi vòng lặp*/ END;

Chương 4: Lập trình PL/SQL 24

Cấu trúc điều khiển (tt)

3. Lệnh lặp FOR…LOOP Cú pháp:

IN giá-trị-khởi-tạo .. giá-trị-kết-thúc

FOR LOOP END LOOP;

Chương 4: Lập trình PL/SQL 25

Cấu trúc điều khiển - For (tt)

Ví dụ:

declare z number:=1; /*khởi tạo biến z*/ i number; BEGIN

FOR i IN 1 .. 10 LOOP

z :=z+3; /*tính biểu thức lặp*/ DBMS_OUTPUT.PUT_LINE(z);

END LOOP;

END;

Chương 4: Lập trình PL/SQL 26

Cấu trúc điều khiển – For (tt)

4. Lệnh lặp WHILE...LOOP Cú pháp:

END LOOP;

WHILE <điều kiện> LOOP

(Phân biệt giữa 3 lệnh Loop … End: Loop và

For…Loop, While…Loop: đều sử dụng lệnh Loop)

Chương 4: Lập trình PL/SQL 27

Cấu trúc điều khiển – While (tt)

Ví dụ:

declare z number:=1; /*khởi tạo biến z*/ i number; BEGIN

WHILE (i<=10) LOOP i:=i+1; z :=z+3; /*tính biểu thức lặp*/ DBMS_OUTPUT.PUT_LINE(z);

END LOOP;

END;

Chương 4: Lập trình PL/SQL 28

Cấu trúc điều khiển (tt)

5. Sử dụng tên nhãn và lệnh GOTO - Một tên nhãn được dùng để đặt tên cho một khối

lệnh PL/SQL hoặc các câu lệnh bên trong khối.

- Tên nhãn được định nghĩa bằng cách sử dụng dấu

nhọn <>.

- Câu lệnh GOTO rẽ nhánh không điều kiện đến một nhãn. Khi thực hiện, câu lệnh GOTO thay đổi luồng điều khiển trong một khối để chuyển đến thực hiện lệnh nằm trong nhãn.

- GOTO không được phép trong một số trường hợp:  Từ một xử lý ngoại lệ vào trong khối hiện hành.  Nhảy ra ngoài chương trình con.

Chương 4: Lập trình PL/SQL 29

Cấu trúc điều khiển – Goto (tt)

Ví dụ:

GOTO inner_block <> --Tên nhãn declare Begin End; /*End của <>*/

<> declare Begin End; /*End của <>*/

BEGIN END;

Chương 4: Lập trình PL/SQL 30

Cấu trúc điều khiển (tt)

6. Xử lý ngoại lệ - EXCEPTION 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ệ.

Những ngoại lệ bên trong được sinh ra một cách tiềm ẩn (không tường minh, implicit), trái lại những ngoại lệ do người dùng định nghĩa được sinh ra một cách tường minh (explicit) bằng cách sử dụng câu lệnh RAISE.

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.

Chương 4: Lập trình PL/SQL 31

Cấu trúc điều khiển – Exception (tt)

Định nghĩa ngoại lệ: DECLARE /*nếu là Block ngoài cùng của Function hoặc Procedure thì không dùng

loi_ngoai_le EXCEPTION; ….

RAISE loi_ngoai_le; /*bật ngoại lệ*/

… IF <điều kiện lỗi> then END IF ;

…..

….

Declare*/ BEGIN EXCEPTION WHEN loi_ngoai_le then WHEN OTHERS then END;

Chương 4: Lập trình PL/SQL 32

Cấu trúc điều khiển – Exception (tt)

trung_ma_so EXCEPTION; /*khai báo 1 ngoại lệ tên “trung_ma_so”*/

RAISE trung_ma_so;

IF maso=„A100‟ then

ELSE return 2; END IF ;

return 1; /*đã có mã số này rồi*/

Ví dụ: (ta quy định 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 BEGIN /*đây là ngoại lệ tường minh  bắt ngoại lệ bằng từ khóa RAISE*/ EXCEPTION WHEN trung_ma_so then WHEN OTHERS then /*sử dụng từ khóa OTHERS cho các lỗi khác past_due, việc sử dụng OTHERS

đảm bảo không có ngoại lệ nào sẽ không được xử lý*/

return 0; /*lỗi phát sinh*/ END;

Chương 4: Lập trình PL/SQL 33

Cấu trúc điều khiển – Exception (tt)

Điều kiện khi ngoại lệ xảy ra

Các lỗi ngoại lệ do Oracle định nghĩa

Ngoại lệ CURSOR_ALREADY_OPEN Mở một cursor, mà cursor đó đã ở trạng thái đang

mở.

DUP_VAL_ON_INDEX

Khi có thao tác INSERT hoặc UPDATE vi phạm ràng buộc UNIQUE.

INVALID_CURSOR

Mở một cursor chưa tạo hoặc đóng một cursor mà nó chưa được mở.

INVALID_NUMBER

Lỗi chuyển kiểu dữ liệu từ string sang kiểu number.

LOGIN_DENIED

Đăng nhập sai username/password.

NO_DATA_FOUND

Câu lệnh SELECT INTO không trả về dòng nào.

NOT_LOGGED_ON

Một chương trình PL/SQL cần thao tác đến CSDL Oracle nhưng lại chưa đăng nhập vào CSDL.

PROGRAM_ERROR

Một số lỗi chương trình, ví dụ một hàm (function) không chứa mệnh đề RETURN trả về giá trị.

Chương 4: Lập trình PL/SQL 34

Cấu trúc điều khiển – Exception (tt)

Các lỗi ngoại lệ do Oracle định nghĩa (tt)

Điều kiện khi ngoại lệ xảy ra Lỗi bộ nhớ

Ngoại lệ STORAGE_ERROR

TIMEOUT_ON_RESOURCE Lỗi timeout xảy ra khi Oracle đang chờ tài nguyên

TOO_MANY_ROWS

Câu lệnh SELECT INTO trả về nhiều hơn một dòng

VALUE_ERROR

Lỗi chuyển kiểu dữ liệu hoặc thao tác vi phạm ràng buộc toàn vẹn (RBTV)

ZERO_DIVIDE

Lỗi chia một số cho zero

Chương 4: Lập trình PL/SQL 35

Cấu trúc điều khiển – Exception (tt)

return number As

x number(4,2);

/*Dual là table tạm*/

Chạy lệnh sau trong SQL*Plus để thấy kết quả xử lý 2 trường hợp khác nhau: Select Test_Exception (5) From Dual; Hoặc: Select Test_Exception (0) From Dual;

Ví dụ ngoại lệ ZERO_DIVIDE do Oracle định nghĩa: Create Function Test_Exception (so number) Begin x:=100/so; return 1; EXCEPTION WHEN ZERO_DIVIDE then /*lỗi do Oracle định nghĩa*/ return 0; /*Lỗi chia zero*/ END;

Chương 4: Lập trình PL/SQL 36

Cấu trúc điều khiển – Exception (tt)

select * into Sinhvien_Row from SINHVIEN where masv = masv_t;

Ví dụ ngoại lệ NO_DATA_FOUND do Oracle định nghĩa: DECLARE Sinhvien_Row SINHVIEN%ROWTYPE; Masv_t Char(5); BEGIN Masv_t := 'A2345'; DBMS_OUTPUT.PUT_LINE(Sinhvien_Row.HotenSV); EXCEPTION WHEN NO_DATA_FOUND then DBMS_OUTPUT.PUT_LINE('khong co sv nay'); END;

Chương 4: Lập trình PL/SQL 37

VI. Kiểu con trỏ

1. Giới thiệu Con trỏ (cursor) là một đối tượng liên kết với một tập dữ liệu và cho phép người lập trình làm việc với từng dòng của tập dữ liệu đó.

Cho phép xử lý dữ liệu gồm nhiều dòng. Số dòng

được lấy ra xử lý phụ thuộc vào lệnh xử lý sau đó.

Trong xử lý, các thao tác sẽ tác động lên từng

mẩu tin của dữ liệu đã được nạp vào con trỏ.

Có hai loại con trỏ: con trỏ đuợc khai báo tường minh (explicit cursor) và con trỏ không được khai báo tường minh (hay còn gọi là con trỏ tiềm ẩn (implicit cursor)).

Chương 4: Lập trình PL/SQL 38

Con trỏ (tt)

 Con trỏ tiềm ẩn: một lệnh SQL được xử lý bởi Oracle và không được đặt tên bởi người sử dụng.

Các lệnh SQL được thực hiện trong một con trỏ tiềm ẩn

bao gồm UPDATE, INSERT, DELETE.

INSERT INTO KHOA (MAKH, TENKH)

Ví dụ: Khối lệnh …. VALUES (‘TH’, ‘Tin hoc’)

 Con trỏ tường minh: Là con trỏ được đặt tên bởi người sử dụng (câu SELECT được đặt tên).

Ví dụ: CURSOR c_kh IS SELECT MAKH, TENKH FROM KHOA

Chương 4: Lập trình PL/SQL 39

Con trỏ (tt)

-> đóng cursor

2. Khai báo cursor (khai báo con trỏ) Các bước thực hiện trên con trỏ: Khai báo -> mở cursor -> lấy dữ liệu để xử lý Cú pháp: --Khai báo con trỏ CURSOR tên_cursor IS Câu_SELECT; --Mở con trỏ OPEN [ [( )] ]; --Lấy dữ liệu FETCH INTO ; --Ðóng con trỏ CLOSE < têncontrỏ>;

Chương 4: Lập trình PL/SQL 40

Con trỏ (tt)

3. Thuộc tính con trỏ tường minh Mọi con trỏ khai báo tường minh đều có 4 thuộc tính: %NOTFOUND, %FOUND, %ROWCOUNT, %ISOPEN. Các thuộc tính này được thêm vào sau phần tên của con trỏ.

Thuộc tính

Diễn giải

%ISOPEN

TRUE nếu con trỏ đang mở, ngược lại trả về FALSE.

%NOTFOUND Trả về TRUE khi đã fetch đến dòng cuối cùng của con trỏ, ngược lại bằng FALSE. Ngược lại với %NotFound

%FOUND %ROWCOUNT Trả về số dòng của con trỏ đã được fetch.

Chương 4: Lập trình PL/SQL 41

Con trỏ (tt)

--1. Khai báo con trỏ

--Khai báo biến con trỏ truy cập --từng mẩu tin --2. Mở con trỏ

--3. Lấy mẩu con trỏ

--4. Đóng con trỏ

Ví dụ 1 con trỏ: in danh sách đề tài DECLARE CURSOR C_DETAI IS SELECT MADT, TENDT, CHUNHIEM, KINHPHI FROM DETAI; V_DETAI C_DETAI%ROWTYPE; BEGIN OPEN C_DETAI; DBMS_OUTPUT.PUT_LINE('MADT | TENDT | CHUNHIEM| KINHPHI'); LOOP FETCH C_DETAI INTO V_DETAI; EXIT WHEN C_DETAI%NOTFOUND; --Thoát khỏi vòng lặp khi ctrỏ rỗng DBMS_OUTPUT.PUT_LINE(V_DETAI.MADT || '|' || V_DETAI.TENDT || '|' || V_DETAI.CHUNHIEM || '|' || V_DETAI.KINHPHI); END LOOP; CLOSE C_DETAI; END;

Chương 4: Lập trình PL/SQL 42

Con trỏ (tt)

IF SQL%NOTFOUND THEN

Vd2: Thuộc tính %ROWCOUNT UPDATE DETAI SET KINHPHI=30 WHERE MADT='DT003'; IF SQL%ROWCOUNT >0 THEN DBMS_OUTPUT.PUT_LINE('KINH PHI MOI'); END IF; Vd3: Thuộc tính %NOTFOUNT DELETE FROM DETAI WHERE MADT=‘DT222'; DBMS_OUTPUT.PUT_LINE ('Khong co de tai DT222'); END IF;

Chương 4: Lập trình PL/SQL 43

Con trỏ (tt)

 SELECT FOR UPDATE

Cho phép khóa các mẫu tin đang truy xuất để tiến

hành xử lý.

Các mẫu tin tự động bị khóa khi mở Cursor và khóa

khi được COMMIT/ ROLLBACK

SELECT … FROM… FOR UPDATE [OF ];

Cú pháp:  WHERE CURRENT OF

Tiếp nối mệnh đề FOR UPDATE, Chỉ định câu lệnh update/delete thay đổi dữ liệu trên những dòng của cursor hiện hành có định nghĩa FOR UPDATE.

Cú pháp: UPDATE [| DELETE ]

WHERE CURRENT OF

Chương 4: Lập trình PL/SQL 44

Con trỏ (tt)

SELECT MASV, HOTENSV FROM SINHVIEN FOR UPDATE OF HOTENSV;

UPDATE SINHVIEN SET HOTENSV = ‘Nguyen Van An’ WHERE CURRENT OF C_SINHVIEN

VD minh hoạ: DECLARE CURSOR C_SINHVIEN IS --- ---

Chương 4: Lập trình PL/SQL 45

VII. Bài tập

A. Viết chương trình tính tổng từ 1  n, với n nhập vào.

B. Viết khối PL/SQL cho phép:

1. Hiển thị họ tên cán bộ, chức vụ và hệ số, với mã số cán bộ

được nhập từ bàn phím

2. Tăng hệ số cho những cán bộ:

• Nếu có chức vụ thì tăng 0.5

• Ngược lại thì không tăng.

3. Xuất thông báo khi không có cán bộ có hệ số trên 4.0

Chương 4: Lập trình PL/SQL 46

Tóm tắt chương

- Tìm hiểu cấu trúc chương trình PL/SQL - Các mệnh đề trong PL/SQL - Cấu trúc điều khiển IF - Cấu trúc vòng lặp loop, for, while - Lập trình con trỏ PL/SQL

Chương 4: Lập trình PL/SQL 47