www.nhipsongcongnghe.net Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL Công ty cổ phần đầu t phát triển công nghệ - Fpt Hà Nội, tháng 11 năm 2002 Đào tạo Oracle Giáo trình SQL PL/SQL Đào tạo bản: SQL PL/SQL Trang Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL vµ PL/SQL Mơc lơc Mơc lơc Giíi thiƯu .6 1.1 1.2 Mục tiêu khoá häc Khởi động tho¸t khái Oracle .6 1.2.1 1.2.2 1.3 Giíi thiệu ngôn ngữ SQL 1.3.1 1.3.2 1.4 1.5 1.6 1.7 Lệnh truy vấn 10 Các thành phần khác mƯnh ®Ị SELECT 10 Giá trị Null 11 Lọc liệu từ row có giá trị 11 HiĨn thÞ cÊu tróc b¶ng 12 C¸c lƯnh cđa c«ng SQL*Plus 12 2.6.1 2.6.2 2.6.3 2.7 Các hàm số 20 Các hàm ký tự 22 Các hàm ngày 26 Các hàm chuyển đổi kiểu .28 Bµi tËp 29 Bµi tËp 32 Các hàm nhóm áp dụng cho lớn dòng liệu 32 6.1 6.2 6.3 MƯnh ®Ị ORDER BY 16 MƯnh ®Ị WHERE .16 C¸c to¸n tư 17 Bµi tËp 19 BiÕn runtime 31 5.1 Bµi tËp 14 Các hàm áp dụng cho dòng liÖu 20 4.1 4.2 4.3 4.4 4.5 Các lệnh soạn th¶o .12 C¸c lƯnh vỊ file 13 C¸c lƯnh vỊ column .13 Truy vÊn d÷ liƯu cã ®iỊu kiƯn 16 3.1 3.2 3.3 3.4 Mô hình quan hệ liệu Mô tả d÷ liƯu LƯnh truy vÊn c¬ b¶n 10 2.1 2.2 2.3 2.4 2.5 2.6 Lịch sử phát triển ngôn ngữ SQL .7 ChuÈn SQL .7 C¸c kh¸i niƯm CSDL .7 Danh sách rút gọn đối t−ỵng CSDL C¸c lƯnh SQL Giíi thiƯu vỊ vÝ dơ thùc hµnh 1.7.1 1.7.2 T¹i Server (Window NT) T¹i Client (Window 9x) Các hàm tác động nhóm 32 MƯnh ®Ị GROUP BY 34 Bµi tËp 35 Hiển thị nội dung liệu từ nhiều bảng 35 7.1 Mối liên kết tơng đơng 35 Đào tạo bản: SQL PL/SQL Trang Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL 7.2 7.3 7.4 7.5 7.6 C¸c lƯnh truy vÊn lång 39 8.1 8.2 Mối liên kết không tơng đơng 35 Mèi liªn kÕt céng .36 Liên kết bảng với .36 Các toán tử tập hợp 36 Bµi tËp 37 C©u lƯnh SELECT lång 39 Bµi tËp 40 Cấu trúc hình 40 9.1 9.2 9.3 Cấu trúc hình table .40 Kü thuËt thùc hiÖn 41 Bµi tËp 42 10 Tỉng kÕt vỊ lƯnh select .44 11 T¹o table 44 11.1 11.2 11.3 11.4 Lệnh tạo bảng 44 Các quy tắc đặt tên object .46 Các quy tắc tham chiÕu ®Õn object 47 KiĨu d÷ liƯu điều kiện 47 11.4.1 11.4.2 11.4.3 11.4.4 11.4.5 11.4.6 11.4.7 11.4.8 11.4.9 11.4.10 11.4.11 CHAR 47 VARCHAR2 48 VARCHAR 48 NUMBER .48 FLOAT 48 LONG 49 DATE 49 RAW vµ LONG RAW 50 ROWID 50 MLSLABEL 50 Chun ®ỉi kiĨu 50 11.5 Constraint 51 11.6 Bµi tËp 52 12 lệnh DDL khác liệu từ điển liệu .52 12.1 ChØnh sưa cÊu tróc table 52 12.2 C¸c lƯnh DDL kh¸c 53 12.2.1 12.2.2 12.2.3 12.2.4 Xãa table .53 Gi¶i thÝch b¶ng 53 Thay ®ỉi tªn object 53 Xãa d÷ liƯu cđa table 53 12.3 Dữ liệu từ điển liệu 54 12.4 Bµi tËp 54 13 C¸c lƯnh Thao t¸c liệu khác 55 13.1 13.2 13.3 13.4 13.5 13.6 14 ChÌn mét row vµo table 55 ChØnh sưa d÷ liƯu 55 Xãa dßng 55 Lỗi ràng buộc liệu .56 Lệnh điều khiển giao dịch 56 Bµi tËp 57 Sequence vµ index 57 Đào tạo bản: SQL PL/SQL Trang Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL 14.1 Sequence 57 14.1.1 14.1.2 T¹o Sequence .57 Xoá sửa sequence 58 14.2 Index 58 14.3 Bµi tËp 59 15 T¹o view 59 15.1 View 59 15.2 Bµi tËp 61 16 Quyền bảo mật 61 16.1 QuyÒn - PRIVILEGE 61 16.2 ROLE 62 16.3 Synonym 63 17 tỉng quan vỊ pl/sql vµ procedure builder .63 17.1 Có ph¸p lƯnh PL/SQL .63 17.2 PL/SQL block 63 17.3 Giíi thiÖu Procedure builder 64 18 có ph¸p lËp tr×nh 66 18.1 18.2 18.3 18.4 18.5 19 cursor 68 19.1 19.2 19.3 19.4 19.5 20 IF 66 LOOP vµ EXIT 66 FOR 67 WHILE 67 GOTO 67 Định nghÜa 68 KiÓu liệu Table Record 69 Sao kiĨu d÷ liƯu 70 C©u lƯnh SELECT INTO PL/SQL 70 Bµi tËp 70 procedure vµ funtion 71 20.1 Procedure 71 20.2 Function 72 20.3 Bµi tËp 73 21 pakage .73 21.1 Package .73 22 database trigger 74 22.1 Database Trigger .74 22.2 Bµi tËp 75 23 error handing 76 23.1 Bµi tËp 78 Đào tạo bản: SQL PL/SQL Trang Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL Giới thiệu 1.1 Mục tiêu khoá học Kết thúc khoá học học viên phải nắm đợc ã Hiểu đợc phơng pháp, thành phần, thuật ngữ thao tác CSDL quan hệ ã Tạo đợc cấu trúc liệu nh table, view dùng SQL ã Ghi, đọc, cập nhật liệu CSDL ã Xây dựng PL/SQL block dùng Procedure Builder 1.2 Khởi động thoát khỏi Oracle 1.2.1 Tại Server (Window NT) SQLDBA cung cấp dịch vụ quản trị hệ thống, nh: tạo lập CSDL, mở - đóng CSDL, tạo quản lý USER Các bớc để khởi động Server nh sau: ã Khởi động máy chủ ã Bật dịch vụ OracleServiceXXX (trong XXX tên CSDL) cách nhấn vào Start -> Program > Service -> OracleServiceXXX -> NhÊn cht ph¶i -> NhÊn Start Chó ý chØ bật dịch vụ ngời cài đặt không để chế độ tự động hay dịch vụ cha đợc bật ã Bật dịch vụ OracleXXXTNSLístener (trong XXX tên Database Home) cách nhấn vào Start -> Program -> Service -> OracleXXXTNSLÝstener -> NhÊn chuét ph¶i -> Nhấn Start Chú ý bật dịch vụ ngời cài đặt không để chế độ tự động hay dịch vụ cha đợc bật ã Khi bật xong CSDL đà sẵn sàng để làm việc Để đóng CSDL cần làm theo bớc ngợc lại: ã Tắt dịch vụ OracleXXXTNSLístener (trong XXX tên Database Home) cách nhấn vào Start -> Program -> Service -> OracleXXXTNSLÝstener -> NhÊn chuét ph¶i -> NhÊn Stop ã Tắt dịch vụ OracleServiceXXX (trong XXX tên CSDL) cách nhấn vào Start -> Program > Service -> OracleServiceXXX -> NhÊn chuét ph¶i -> NhÊn Stop ã Shutdown máy chủ 1.2.2 Tại Client (Window 9x) Các ứng dụng oracle chạy môi trờng Windows với giao diƯn graphic, c¸c øng dơng th−êng dïng cã SQL*Plus, Oracle Form, Oracle Report, Oracle Designer Việc chạy ứng dụng hoàn toàn giống nh việc chạy ứng dụng thông thờng môi trờng windows Để làm viƯc víi c¸c øng dơng truy cËp CSDL Oracle, ng−êi sử dụng (NSD) phải connect vào CSDL Có hai cách ®Ĩ connect Connect NSD/password, vÝ dơ NSD tªn Scott cã password tiger Connect Scott/tiger Phát lệnh connect với tên NSD, Oracle hỏi password Connect Scott Enter password: ***** Đào tạo bản: SQL PL/SQL Trang Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL NSD làm việc phạm vi cho phép mà Oracle gọi "khung cảnh" (Schema) NSD Mỗi khung cảnh chứa nhiều đối tợng loại, NSD tác động lên đối tợng khung cảnh Trong ứng dụng có chức thoát tự động disconnect Để thực hành phần SQL PL/SQL gọi ứng dụng SQL* Plus 1.3 Giới thiệu ngôn ngữ SQL 1.3.1 Lịch sử phát triển ngôn ngữ SQL Mô hình sở liệu (CSDL) quan hệ E.F Codd đa vào đầu thập kỷ 70, từ đến liên tục phát triển trở thành mô hình CSDL phổ biến bậc (RDBMS) Mô hình quan hệ gồm thành phần sau: ã Tập hợp đối tợng và/hoặc mối quan hệ ã Tập hợp xử lý tác động tới quan hệ ã Ràng buộc liệu đảm bảo tính xác quán SQL (Structured Query Language, đọc "sequel") tập lệnh truy xuất CSDL quan hệ Ngôn ngữ SQL đợc IBM sử dụng hệ quản trị CSDL System R vào năm 70, hệ ngôn ngữ SQL (SEQUEL2) đợc IBM công bố vào tháng 11 năm 1976 Năm 1979, tập đoàn ORACLE giới thiệu thơng phẩm SQL, SQL đợc cài đặt hệ quản trị CSDL nh DB2 IBM SQL/DS Ngày nay, SQL đợc sử dụng rộng rÃi đuợc xem ngôn ngữ chuẩn để truy cập CSDL quan hệ 1.3.2 Chuẩn SQL Năm 1989, viện tiêu chuẩn quốc gia Hoa kỳ (ANSI) công nhận SQL ngôn ngữ chuẩn để truy cập CSDL quan hệ văn ANSI SQL89 Năm 1989, tổ chức tiêu chuẩn quốc tế (ISO) công nhận SQL ngôn ngữ chuẩn để truy cập CSDL quan hệ văn ISO 9075-1989 Tất hệ quản trị CSDL lớn giới cho phép truy cập SQL hầu hết theo chuẩn ANSI 1.4 Các khái niệm CSDL Table cấu trúc lu trữ CSDL quan hệ (RDBMS), bao gồm nhiều column nhiều row Row tổ hợp giá trị Column bảng Một row đợc gọi record Column hiển thị loại liệu bảng, ví dụ tên phòng ban bảng phòng ban Ngời ta thể thông qua tên column giữ số liệu dới kiểu kích cỡ định Field giao column row Field nơi chứa liệu Nếu liƯu field ng−êi ta nãi field cã gia trÞ null Primary Key column tập column xác định tính row bảng Ví dụ mà phòng ban Primary Key thiết phải có số liệu Foreign Key column tập column tham chiếu tới bảng bảng khác Foreign Key xác định mối quan hệ bảng Constraint ràng bc d÷ liƯu, vÝ dơ Foreign Key, Primary Key Đào tạo bản: SQL PL/SQL Trang Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL Ví dụ: EMP EMPNO DEPT ENAME DEPTNO EMP 7369 DEPTNO DNAME DEPT 20 10 ACCOUNTING 7499 ALLEN 30 20 RESEARCH 7521 WARD 30 7566 JONES 20 30 SALES 7654 MARTIN 30 40 OPERATIONS 7698 BLAKE 30 7782 Row SMITH CLARK 10 Foreign key Primary key Column 1.5 Danh sách rút gọn đối tợng CSDL Table cấu trúc lu trữ CSDL quan hƯ (RDBMS), gåm row vµ column View cấu trúc logic hiển thị liệu từ nhiều bảng Sequence kết sinh giá trị cho primary key Index tăng tính thực thi cáu truy vấn Synonym tên tơng đơng đối tợng Program unit gåm Procedure, function, package 1.6 C¸c lƯnh SQL LƯnh SELECT INSERT UPDATE DELETE CREATE ALTER DROP RENAME TRUNCATE COMMIT ROLLBACK SAVE POINT GRANT REVOKE Mô tả Là lệnh thông dụng nhất, dùng để lấy, xem liệu CSDL Là lệnh dùng để nhập thêm row mới, thay đổi nội dung liệu row hay xoá row table Những lệnh đợc gọi lệnh thao tác liệu DML (Data Manipulation Language) Là lệnh dùng để thiết lập, thay đổi hay xoá bỏ cấu trúc liệu nh table, view, index Những lệnh đợc gọi lệnh định nghĩa liệu DDL (Data Definition Language) Quản lý việc thay đổi liệu lệnh DML Việc thay đổi liệu đợc nhóm lại thành transaction lệnh dùng để gán huỷ quyền truy nhập vào CSDL Oracle cấu trúc bên Những lệnh đợc gọi lệnh điều khiển liệu DCL (Data Đào tạo bản: SQL PL/SQL Trang Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL Control Language) 1.7 1.7.1 Giới thiệu ví dụ thực hành Mô hình quan hệ liệu DEPT EMP SALGRADE DUMMY 1.7.2 BONUS Mô tả liệu Tên Kiểu Khoá Giải thích DEPTNO NUMBER(2) NOT NULL PK Mà phòng ban DNAME CHAR(14) Tên phòng ban LOC CHAR(13) Địa DEPT SALGRADE GRADE NUMBER LOSAL NUMBER PK Mức lơng Giá trị thấp HISAL NUMBER Giá trị cao EMP EMPNO NUMBER(4) NOT NULL, ENAME CHAR(10), JOB CHAR(9), MGR NUMBER(4) HIREDATE DATE Ngày gia nhập công ty SAL NUMBER(7,2) Lơng COMM NUMBER(2) NOT NULL, Đào tạo bản: SQL PL/SQL Mà nhân viên Tên nhân viên Nghề nghiệp FK (EMP.EMPNO) NUMBER(7,2) DEPTNO PK M· ng−êi qu¶n lý Th−ëng FK (DEPT.DEPTNO) Mà phòng ban Trang Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL Lệnh truy vấn 2.1 Lệnh truy vấn SELECT [DISTINCT ] {*, column [alias], } FROM table; ã SELECT column trả lời câu hỏi lấy liệu nào? (column, biểu thức ), mệnh đề SELECT cần có ã FROM trả lời câu hỏi lấy liệu đầu? (table, view ) ã DISTINCT định hiển thị lần liệu trùng ã * thay cho việc tên tất column ã alias đa nhÃn column hiển thị liệu Vd: SELECT * FROM emp; SELECT empno, ename, deptno, mgr FROM emp; SELECT DISTINCT job nghenghiep FROM emp; 2.2 Các thành phần khác mệnh đề SELECT Trong mệnh đề SELECT đa vào thành phần khác: ã Biểu thức toán học ã Column alias ã Các column đợc ghép chuỗi ã Literal Biểu thức toán học Trong mệnh ®Ị SELECT biĨu thøc to¸n häc cã thĨ c¸c gi¸ trị (column hàng số), toán tử, hàm Các toán tử đợc dùng (+), (-), (*), (/) Độ u tiên toán tử giống phần sè häc Vd: SELECT ename, sal *12, comm FROM emp; SELECT ename, (sal+250)*12 FROM emp; Column alias Trong mƯnh ®Ị SELECT, column alias phần nhÃn hiển thị column lấy số liệu Trong column alias không đợc có dấu cách viết cách sau tên column dấu cách Column alias đợc chấp nhận có dấu cách đợc đặt dấu nháy kép ( ) Vd: (ANUAL chÝnh lµ column alias) SELECT ename, SAL*12 ANUAL, comm FROM emp; Các column đợc ghép chuỗi Toán tử ghép chuỗi (||) cho phép column đợc nối với thành dạng chuỗi Có thể có nhiều toán tử ghép chuỗi column alias Vd: SELECT empno||ename EMPLOYEE FROM emp; SELECT ename || ' co luong la ' || (sal+250)*12 as "mieu ta" FROM emp; Chuỗi đặt nháy đơn, bí danh đặt nháy kép Đào tạo bản: SQL PL/SQL Trang 10 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL BEGIN UPDATE emp SET sal = 9000 WHERE empno = 0001; END; VÝ dô DECLARE v_deptno NUMBER(2); v_loc VARCHAR2(15); BEGIN SELECT deptno, loc INTO v_deptno, v_loc FROM dept WHERE dname = 'SALES'; END; 17.3 Giíi thiƯu Procedure builder Trong Procedure Builder cã thĨ x©y dùng đoạn chơng trình PL/SQL nh program units, libraries, database triggers client-side server-side Procedure Builder có số thành phần sau: ã Object Navigator phần hiển thị đối tợng Procedure Builder's ã Program Unit editor ã PL/SQL Interpreter ã Wizard Object Navigator Đặc tính ã Đóng (+), mở (-) node để xem thông tin ã Có thể connect vào CSDL để xem thông tin đối tợng CSDL ã Kéo thả để copy đối tợng ã Tìm kiếm đối tợng Program Unit editor ã Tác dụng: Dùng để soạn thảo đoạn chơng trình PL/SQL dễ dàng ã Cách gọi: Nhấn đúp vào icon bên trái program unit Hoặc Nhấn đúp vào nút (+) để tạo Program unit ã Tiện ích Compile: Dịch Đào tạo bản: SQL PL/SQL Trang 64 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL New: Tạo Name: Tìm theo program unit Delete: Xoá Close: Đóng Help: Trợ giúp Apply Revert PL/SQL Interpreter ã Khi chọn program unit Nội dung program unit lên cửa số Interpreter để debug ã Cửa số interpreter có phần đánh lệnh PL/SQL sau dấu nhắc PL/SQL> Wizard ã Cửa sổ Wizard hiển thị tạo program unit công cụ Wizard ã Công cụ giúp dễ dàng việc xây dựng program unit Tạo program unit ã Tạo cách nhấn vào nút (+) toolbar ã Soạn thảo Trợ giúp soạn thảo menu edit Có thể dùng import export menu file để đa thêm/loại bỏ đoạn text Chọn Syntax palete menu program để trợ giúp cú pháp Compile để tìm lỗi, thông báo lỗi lên dòng cuối cửa số Database Trigger ã Tạo mới: Nhấn vào nút (+), chọn loại database Trigger ã Soạn thảo: Giống nh với Program unit Thêm lựa chọn thuộc tính trigger Tìm vết sửa lỗi Program Unit ã Tìm vết, sửa lỗi Program Unit PL/SQL interpreter gồm có: Toolbar Command line ã Tạo breakpoint (nhấn đúp vào số dòng lệnh) để dừng đoạn chơng trình, kiểm tra biến runtime, liệu ã Các công cụ interpreter Step into: Thực tiếp đến dòng lệnh (có thể program unit) Step over: Thực tiếp đến dòng lệnh nh−ng chØ Program unit ®ã Step out: Thùc phần lại chơng trình Go: Thực đến cuối chơng trình dừng lại có breakpoint Đào tạo bản: SQL PL/SQL Trang 65 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL Reset: Bỏ breakpoint Tổ chức PL/SQL Program Unit ã Các PL/SQL Program Unit thờng đợc tổ chức lại library (.PLL/.PPL) Create: T¹o mét library míi Open: Më library Save: Ghi lại thay đổi ã Attached library: Sử dụng program unit Attached library nh hàm mặc định ã Stored Program Unit: Cất Program Unit thành Stored Program Unit CSDL 18 cú pháp lập trình 18.1 IF IF condition THEN actions [ELSIF condition THEN actions] [ELSE actions] END IF VÝ dô IF ename := 'SCOTT' THEN beam_me_up := 'YES'; COMMIT; ELSE beam_me_up := 'NO'; ROLLBACK; END IF; VÝ dô IF choice= THEN action := 'Run payroll'; ELSIF choice=2 THEN action:='Run'; ELSIF choice=3 THEN action:='Backup'; ELSE action:='Invalid'; END IF; 18.2 LOOP vµ EXIT LOOP actions; [EXIT loop_label [WHEN condition]] END LOOP VÝ dô 1: LOOP counter:=counter-1 INSERT INTO numbered_rows VALUES (counter); IF counter = 10 THEN Đào tạo bản: SQL PL/SQL Trang 66 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL COMMIT; EXIT; END IF; END LOOP; VÝ dô 2: LOOP EXIT WHEN total_sals = 60000; END LOOP; 18.3 FOR FOR control_variable IN [REVERSE] low_value high_value VÝ dô FOR I IN 2000 LOOP INSERT INTO numbered_rows VALUES (i); preserve_i:=i; END LOOP; 18.4 WHILE WHILE condition VÝ dô WHILE Bill më -> lấy liệu để xử lý -> đóng Khai báo cursor is : Mở vùng liệu cất trữ thông tin xử lý vd: cursor x is select deptno from dept where deptno=10; vd: cursor x(b number) is select * from dept where deptno>b; Më cursor open vd: open x; vd: open x(10); Lấy liệu Fetch into Vd: fetch x into b; Đóng cursor Close vd: Close x; Các thuộc tính %isopen : trả lại giá trị True cursor mở %notfound : trả lại giá trị True lệnh fetch thời trả lại row %found : trả lại giá tri true fetch không row %rowcount : trả lại số row đà đợc thùc hiƯn b»ng lƯnh fetch VÝ dơ1: declare cursor v_a is select * from emp; m v_a%rowtype; begin open v_a; loop fetch v_a into m; insert into t_thu(empno, ename,job) values (m.empno,m.ename, m.job); exit when v_a%notfound; end loop; close v_a; end; vÝ dô 2: DECLARE CURSOR c1 IS SELECT dname, loc FROM dept FOR UPDATE OF loc; dept_rec c1%ROWTYPE; sales_count NUMBER:=0; non_sales NUMBER:=0; Đào tạo bản: SQL PL/SQL Trang 68 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL BEGIN OPEN c1; LOOP FETCH c1 INTO dept_rec; EXIT WHEN c1%NOTFOUND; IF dept_rec.dname = 'SALES' AND dept_rec.loc!='DALLAS' THEN UPDATE dept SET loc='DALLAS' WHERE CURRENT OF c1; sales_count:=sales_count+1; ELSIF dept rec.dname!='SALES' AND dept_rec.loc!='NEWYORK' THEN UPDATE dept SET loc ='NEWYORK' WHERE CURRENT OF c1; non_sales:=non_sales+1; END IF; END LOOP; CLOSE c1; INSERT INTO counts (sales_set, non_sales_set) VALUES (sales_count, non_sales); COMMIT; END; 19.2 KiĨu d÷ liệu Table Record Kiểu liệu Table Cú pháp: TYPE type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER; var type_name; VÝ dô TYPE NAME IS TABLE OF EMP.ENAME%TYPE; First_name NAME; Last_name NAME; KiĨu d÷ liƯu Record Có ph¸p TYPE type_name IS RECORD OF (Col1 datatype [NOT NULL{:=|DEFAULT} expr], (Col2 datatype [NOT NULL{:=|DEFAULT} expr] ); var type_name; VÝ dụ Đào tạo bản: SQL PL/SQL Trang 69 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL TYPE emp_rec IS RECORD OF empno number(4) not null, ename char(10), job char(9), mgr number(4), hiredate date default sysdate, sal number(7,2), comm number(7,2), deptno number(2) not null ); Emp_record emp_rec; 19.3 Sao kiÓu liệu Bản ghi PL/SQL biến giữ nhiều giá trị tập hợp biến tơng ứng với trờng table Để định nghĩa kiểu liệu ghi Var varref%ROWTYPE Trong Var : biến ghi Varref : Tên bảng Ví dụ: X emp%ROWTYPE; Để truy nhập đến trờng liệu ghi dùng giống nh row Ví dụ x.empno, x.sal Để kiểu liệu biến X salgade%TYPE X có kiểu liệu giống biến salgrade 19.4 Câu lệnh SELECT INTO PL/SQL Có ph¸p SELECT col1, col2 INTO var1, var2 [cursor_var] FROM table1, table2 [WHERE condition1, condition2 ] [GROUP BY col1, col2 ] [HAVING condition1, condition2 ] [FOR UPDATE]; ®ã: INTO var1, var2 [cursor_var] để đa giá trị table vào biến ( biến cursor ) VÝ dô: SELECT deptno, loc INTO v_deptno, v_loc FROM dept WHERE dname = ‘SALES’; 19.5 Bµi tËp ViÕt đoạn chơng trình tìm kiếm hàng bảng EMP với biến đợc đa từ vào &1 dạng JOb_type(emp.job%type)và đa thông báo thích hợp vào bảng MESSAGES Đào tạo bản: SQL PL/SQL Trang 70 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL Viết đoạn chơng trình ghi liệu vào bảng MESSAGES với cột NUMCOL1 mang giá trị row đợc Insert, row đợc Insert Không đợc Insert row có giá trị 8, thoát khỏi vòng lặp insert sau giá trị 10 Commit sau vòng lặp Liệt kê cột ENAME, HIREDATE, SAL Với điều kiện EMPNO giá trị biến &EMPLOYEE_NO đợc đa vào, sau kiểm tra - Có phải mức lơng lớn 1200 - Tên nhân viên có phải có chứa chữ T - ngày gia nhập quan có phải tháng 10 (DEC) đa giá trị kiểm tra vào bảng message cột charcol1 (thử với giá trị 7654, 7369, 7900, 7876) Đa vào vòng lặp v từ đến 10 lệnh UPDATE messages SET numcol2=100 WHERE numcol1 = v; nÕu bÊt kú mét lần update có số lợng row >1 exit khỏi vòng lặp 20 procedure funtion 20.1 Procedure Là nhóm lệnh thực chức nhằm tăng khả xử lý, khả sử dụng thủ tục chung, tăng tính bảo mật an toàn liệu, tiện ích phát triển Cú pháp: Procedure : Là tên procedure đợc tạo Argument : Gồm tên danh sách biến kiểu IN : Chỉ định bạn phải đa trÞ gäi procedure OUT : ChØ r»ng Procedure trả lại trị cho biến tới môi trờng gọi IN OUT : Chỉ bạn phải gán trị cho argument gọi procedure procedure trả lại trị argument tới môi trờng gọi Nếu không ghi IN, OUT IN OUT ngầm định IN Đào tạo bản: SQL PL/SQL Trang 71 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL Datatype : Là kiểu argument, đợc khai báo kiểu mà kgông đợc khai báo chiều dài argument Ví dụ không đợc khai báo argument VARCHAR2(10) mà phải khai báo VARCHAR2 Pl/sql_subprogram_body: Là phần thân procedure ®−ỵc viÕt b»ng PL/SQL VÝ dơ: CREATE OR REPLACE PROCEDURE INS_DEPT(X NUMBER, Y VARCHAR2) IS BEGIN INSERT INTO DEPT(DEPTNO,DNAME) VALUES (X,Y); END; Mn thùc hiƯn procedure t¹i SQL plus thù dùng lệnh execute execute ins_dept(55,’ New Name’); 20.2 Function Có ph¸p: C¸c tham giống nh procedure nhng khác sau gọi hàm trả lại trị Ví dụ: create or replace function get_dname( y number) return varchar2 is m char(14); begin select dname into m from dept where deptno=y; if SQL%notfound then m:='Khong thay'; end if; return(rtrim(m)); end; Để gọi hàm get_dname ta gọi trực tiếp thông qua phép gán Ví dô: SQL> select * from dept where dname=get_dname(10); DEPTNO 10 DNAME -ACCOUNTING LOC NEW YORK SQL> select get_dname(20) from dual; GET_DNAME(20) -Đào tạo bản: SQL PL/SQL Trang 72 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL RESEARCH 20.3 Bài tập Viết hàm lấy tên giám đốc theo biến empno đợc nhập vào, Viết thủ tục nhập thông tin vào bảng message trờng numcol1: Mà phòng charcol1: tên phòng ban numcol2: tổng lơng phßng ViÕt thđ tơc dïng cursor; lÊy sè liƯu n ngời (n biến đợc đa vào từ man hình) có mức lơng cao bảng emp đa vào bảng top_sal với giá trị tơng øng num=empno, name = ename, salary = sal) B¶ng top_sal cã cÊu tróc nh− sau: NUM NUMBER(4) NAME VARCHAR2(25) SALARY NUMBER(11,2) 21 pakage 21.1 Package Là tập hợp đối tợng gồm procedure, function, variable, constant, cursor exception Việc tạo package cho phép tăng khả mềm dẻo, tăng tính bảo mật, tạo thuận lợi việc quản lý hệ thống đồng thời tăng hiệu suất xử lý hệ thống Để tạo package thực nh sau: Để tạo package body thực nh sau: Với releases trớc PL/SQL việc gọi functions đợc thực lệnh procedure, nhng lời gọi xuất câu lệnh SQL giống nh lệnh procedure Điều có nghĩa ta cã thĨ sư dơng c¸c functions gièng nh− c¸c built-in SQL functions B»ng c¸c më réng SQL ta cã thĨ tập hợp phân tích bên Oracle Server mà ta không cần lấy liệu vào ứng dụng điều làm tăng tính độc lập sở liệu Tuy nhiên để gọi đợc từ SQL function phải đảm bảo chắn việc kiểm soát kết Với standalone functions Oracle thực điều việc kiểm tra function body Tuy nhiên với body package ẩn packaged functions ta phải sử dụng pragma RESTRICT_REFERENCES để đảm bảo luật Đào tạo bản: SQL PL/SQL Trang 73 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL vµ PL/SQL Pragma Restrict_references(, , ) Trong WNDS: RNDS: WNPS: RNPS: ®ã: Write no database state Read no database state Write no package state Read no package state VÝ dô: create or replace package vidu is function get_dname( y number) return varchar2; Pragma Resctrict_references(get_dname, WNDS, WNPS); Procedure ins_dept (x number, y varchar2); end vidu; create or replace package body vidu is function get_dname( y number) return varchar2 is m char(14); begin select dname into m from dept where deptno=y; if SQL%notfound then m:='Khong thay'; end if; return(rtrim(m)); end; procedure ins_dept(x number, y varchar2) is begin insert into dept(deptno,dname) values (x,y); end; end vidu; §Ĩ gäi ta thùc hiƯn nh− sau: SQL> execute vidu.ins_dept(70,'Vi du'); 22 database trigger 22.1 Database Trigger Một Database Trigger đợc tạo lu trữ PL/SQL block tơng ứng với table Nó đợc tự động gọi đến có truy nhập đến table tơng ứng với hành động định nghĩa Để tạo triger ta gõ theo có pháp sau: Đào tạo bản: SQL PL/SQL Trang 74 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL Create or replace : lệnh tạo tạo lại trigger đà tồn Before : Chỉ trigger đợc thực trớc thùc hiÖn lÖnh Affter : ChØ r»ng trigger sÏ ®−ỵc thùc hiƯn sau lƯnh gäi tíi nã Delete, Insert, Update of on : trigger đợc gọi có hành động tơng ứng column bảng Referencing : Chỉ tên quan hệ tới trị cị (OLD) vµ míi (NEW) cđa row For each row WHEN : Trigger thực tơng ứng với row cã ®iỊu kiƯn øng víi mƯnh ®Ị Pl/sql_block : Là khối lệnh PL/SQL thực xử lý theo mong muèn VÝ dô: create or replace trigger t_dname before insert or update of for each row when (new.dname is null) begin if (:new.dname is null) then :new.dname:='No Name'; end if; end ; dname on dept 22.2 Bµi tËp Viết trigger để nhập số liệu vào bảng emp nhập số liệu vào bảng emp1 với điều kiện cấu trúc bảng emp1 có empno, ename, job, dname Thêm cột vào bảng DEP tên SUMSAL Viết trigger để cột SUMSAL chứa tổng lơng phòng ban ( liệu lấy tơng ứng từ bảng emp) Lập bảng tên BACKUP có cấu trúc giống bảng EMP cho ghi emp bị xoá lu sang backup ứng với theo tác insert, update, delete bảng emp, lu lại theo tác vào bảng message, với liệu tơng ứng charcol1 = tên thao tác, datecol2 = Ngày thực Đào tạo bản: SQL PL/SQL Trang 75 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL 23 error handing Error handing lỗi xuất khối lệnh PL/SQL, tất lỗi chạy phần EXCEPTION khối lệnh để xử lý Khối lệnh PL/SQL gồm thành phần DECLARE /Không bắt buộc/ Định nghĩa biến BEGIN Đoạn lệnh; EXCEPTION /Không bắt buộc/ Hành đồng lỗi xuất hiện; END; Có ph¸p thùc hiƯn c¸c EXCEPTION; EXCEPTION WHEN exception1 [OR exception1 .] THEN Xö lý; [WHEN exception3 [OR exception4 .] THEN Xö lý; ] [WHEN OTHERS THEN Xö lý; ] Trong đó: exception : tên lỗi n WHEN OTHERS : dùng để xử lý trờng hợp lỗi khác Điều kiện kích hoạt exception Có nhóm exception: ã Các exception thân Oracle nh: NO_DATA_FOUND, FOUND, TOO_MANY_ROW • C¸c exception ng−êi sư dơng khai b¸o C¸c exception hệ thống tự động bị kích hoạt trờng hợp định Các exception ngời sử dụng định nghĩa phải tự kích hoạt, ví dụ RAISE exception_identifier; Một số exception hay dùng thân Oracle: Tên Mà lỗi Mô tả NO_DATA_FOUND ORA_01403 Câu lệnh SELECT INTO không trả row TOO_MANY_ROW ORA_01422 Câu lệnh SELECT INTO không trả lớn row INVALID_CURSOR ORA_01001 Lỗi xử lý CURSOR ZERO_DIVIDE ORA_01476 Lỗi chia cho Đào tạo bản: SQL PL/SQL Trang 76 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL DUP_VAL_ON_INDEX ORA_00001 Lỗi giá trị bị trùng lắp UNI QUE INDEX Ví dụ Xoá nhân viên bảng emp phòng nhân viên làm việc có nhân viên; Procedure buider PROCEDURE DELEMP (V_EMP IN EMP.EMPNO%TYPE) IS V_ID EMP.EMPNO%TYPE; BEGIN SELECT EMPNO INTO V_ID FROM EMP WHERE EMPNO = V_EMP; DELETE FROM EMP WHERE EMPNO = V_EMP; COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN ROLLBACK; TEXT_IO.PUT_LINE(TO_CHAR(V_EMP)||'KHONG CO'); WHEN TOO_MANY_ROWS THEN ROLLBACK; TEXT_IO.PUT_LINE('CO LOI DU LIEU TRONG BANG EMP'); WHEN OTHERS THEN ROLLBACK; TEXT_IO.PUT_LINE('CO LOI KHAC TRONG BANG EMP'); END; Gäi chạy delemp(7364); Các exception ngời sử dụng định nghĩa Khai b¸o exception identifier EXCEPTION; VÝ dơ: DECLARE credit_exceeded EXCEPTION; BEGIN IF stock_ordered > credit_limit THEN RAISE credit_exceeded; END IF EXCEPTION WHEN credit_exceeded THEN END; Đặt tên cho exception hệ thống Mỗi exception hệ thống đợc gán số xác định, đặt tên cho exception để dễ sử dụng PRAGMA EXCEPTION_INIT (exception_identifier, number) Đào tạo bản: SQL PL/SQL Trang 77 Công ty cổ phần đầu t phát triển công nghệ - FPT Giáo trình SQL PL/SQL Ví dụ DECLARE fetch_failed EXCEPTION; PRAGMA EXCEPTION_INIT (fetch_failed, -1002); BEGIN EXCEPTION WHEN fetch_failed THEN END; 23.1 Bài tập Dùng EXCEPTION bắt lỗi chặt cho tập từ phần 19-22 Đào tạo bản: SQL vµ PL/SQL Trang 78