Đào tạo Oracle cơ bản - Giáo trình SQL và PL SQL
Mục lục
Mục lục .3
1 Giới thiệu.6
1.1 Mục tiêu khoá học .6
1.2 Khởi động và thoát khỏi Oracle.6
1.2.1 Tại Server (Window NT) .6
1.2.2 Tại Client (Window 9x) .6
1.3 Giới thiệu ngôn ngữ SQL .7
1.3.1 Lịch sử phát triển của ngôn ngữ SQL .7
1.3.2 Chuẩn SQL .7
1.4 Các khái niệm trong CSDL.7
1.5 Danh sách rút gọn các đối t-ợng CSDL .8
1.6 Các lệnh SQL .8
1.7 Giới thiệu về ví dụ thực hành.9
1.7.1 Mô hình quan hệ dữ liệu.9
1.7.2 Mô tả dữ liệu.9
2 Lệnh truy vấn cơ bản .10
2.1 Lệnh truy vấn cơ bản.10
2.2 Các thành phần khác của mệnh đề SELECT.10
2.3 Giá trị Null.11
2.4 Lọc dữ liệu từ các row có cùng giá trị.11
2.5 Hiển thị cấu trúc bảng .12
2.6 Các lệnh của công cụ SQL*Plus.12
2.6.1 Các lệnh soạn thảo .12
2.6.2 Các lệnh về file.13
2.6.3 Các lệnh về column.13
2.7 Bài tập.14
3 Truy vấn dữ liệu có điều kiện .16
3.1 Mệnh đề ORDER BY .16
3.2 Mệnh đề WHERE.16
3.3 Các toán tử .17
3.4 Bài tập.19
4 Các hàm áp dụng cho 1 dòng dữ liệu.20
4.1 Các hàm số.20
4.2 Các hàm ký tự .22
4.3 Các hàm ngày .26
4.4 Các hàm chuyển đổi kiểu.28
4.5 Bài tập.29
5 Biến runtime.31
5.1 Bài tập.32
6 Các hàm nhóm áp dụng cho lớn hơn hoặc bằng 1 dòng dữ liệu .32
6.1 Các hàm tác động trên nhóm .32
6.2 Mệnh đề GROUP BY .34
6.3 Bài tập.35
7 Hiển thị nội dung dữ liệu từ nhiều bảng .35
7.1 Mối liên kết t-ơng đ-ơng .35
Công ty cổ phần đầu t- phát triển công nghệ - FPT
Giáo trình SQL và PL/SQL
Đào tạo cơ bản: SQL và PL/SQL Trang 4
7.2 Mối liên kết không t-ơng đ-ơng.35
7.3 Mối liên kết cộng.36
7.4 Liên kết của bảng với chính nó .36
7.5 Các toán tử tập hợp .36
7.6 Bài tập.37
8 Các lệnh truy vấn lồng nhau.39
8.1 Câu lệnh SELECT lồng nhau. .39
8.2 Bài tập.40
9 Cấu trúc hình cây.40
9.1 Cấu trúc hình cây trong 1 table .40
9.2 Kỹ thuật thực hiện .41
9.3 Bài tập.42
10 Tổng kết về lệnh select .44
11 Tạo table .44
11.1 Lệnh tạo bảng .44
11.2 Các quy tắc đặt tên object .46
11.3 Các quy tắc khi tham chiếu đến object.47
11.4 Kiểu dữ liệu và điều kiện.47
11.4.1 CHAR .47
11.4.2 VARCHAR2.48
11.4.3 VARCHAR.48
11.4.4 NUMBER.48
11.4.5 FLOAT.48
11.4.6 LONG .49
11.4.7 DATE.49
11.4.8 RAW và LONG RAW .50
11.4.9 ROWID.50
11.4.10 MLSLABEL.50
11.4.11 Chuyển đổi kiểu .50
11.5 Constraint.51
11.6 Bài tập.52
12 các lệnh DDL khác và dữ liệu trong từ điển dữ 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 Xóa table .53
12.2.2 Giải thích bảng .53
12.2.3 Thay đổi tên object.53
12.2.4 Xóa dữ liệu của table.53
12.3 Dữ liệu trong từ điển dữ liệu .54
12.4 Bài tập.54
13 Các lệnh Thao tác dữ liệu khác .55
13.1 Chèn một row vào table .55
13.2 Chỉnh sửa dữ liệu.55
13.3 Xóa dòng .55
13.4 Lỗi ràng buộc dữ liệu .56
13.5 Lệnh điều khiển giao dịch.56
13.6 Bài tập.57
14 Sequence và index.57
Công ty cổ phần đầu t- phát triển công nghệ - FPT
Giáo trình SQL và PL/SQL
Đào tạo cơ bản: SQL và PL/SQL Trang 5
14.1 Sequence.57
14.1.1 Tạo Sequence.57
14.1.2 Xoá và 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 và 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 IF .66
18.2 LOOP và EXIT.66
18.3 FOR .67
18.4 WHILE .67
18.5 GOTO .67
19 cursor .68
19.1 Định nghĩa .68
19.2 Kiểu dữ liệu Table và Record.69
19.3 Sao kiểu dữ liệu .70
19.4 Câu lệnh SELECT. INTO. trong PL/SQL.70
19.5 Bài tập.70
20 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
này vào bảng message cột charcol1 (thử với các giá trị 7654, 7369, 7900, 7876)
4. Đ−a vào vòng lặp v từ 1 đến 10 lệnh
UPDATE messages SET numcol2=100
WHERE numcol1 = v;
nếu bất kỳ một lần update nào đó có số l−ợng row >1 thì exit khỏi vòng lặp.
20 procedure và funtion
20.1 Procedure
Là một nhóm các lệnh thực hiện chức năng nào đó nhằm tăng khả năng xử lý, khả năng sử dụng các thủ tục
chung, tăng tính bảo mật và an toàn dữ liệu, tiện ích trong phát triển.
Cú pháp:
Procedure : Là tên của procedure đ−ợc tạo.
Argument : Gồm tên của danh sách các biến và kiểu của nó.
IN : Chỉ định rằng bạn phải đ−a trị khi gọi procedure.
OUT : Chỉ ra rằng Procedure sẽ trả lại trị cho biến tới môi tr−ờng gọi nó.
IN OUT : Chỉ ra rằng bạn phải gán trị cho argument khi gọi procedure và procedure sẽ trả lại trị
argument tới môi tr−ờng gọi.
Nếu không ghi IN, OUT hoặc IN OUT thì ngầm định sẽ là IN
Công ty cổ phần đầu t− phát triển công nghệ - FPT
Giáo trình SQL và PL/SQL
Đào tạo cơ bản: SQL và PL/SQL Trang 72
Datatype : Là kiểu của argument, ở đây chỉ đ−ợc khai báo kiểu mà kgông đ−ợc khai báo các chiều dài
argument. Ví dụ không đ−ợc khai báo argument là VARCHAR2(10) mà phải khai báo là VARCHAR2.
Pl/sql_subprogram_body: Là phần thân của 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;
Muốn thực hiện procedure tại SQL plus thự hiện dùng lệnh execute <ten(danh sách giá trị). Còn trong các
thủ tục khác dùng lệnh gọi bình th−ờng
SQL> execute ins_dept(55,’ New Name’);
20.2 Function
Cú pháp:
Các tham giống nh− procedure nh−ng khác là sau khi 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 hoặc thông qua các phép gán.
Ví dụ:
SQL> select * from dept where dname=get_dname(10);
DEPTNO DNAME LOC
--------- -------------- -------------
10 ACCOUNTING NEW YORK
SQL> select get_dname(20) from dual;
GET_DNAME(20)
--------------------------------------------------------
Công ty cổ phần đầu t− phát triển công nghệ - FPT
Giáo trình SQL và PL/SQL
Đào tạo cơ bản: SQL và PL/SQL Trang 73
RESEARCH
20.3 Bài tập
1. Viết hàm lấy tên giám đốc theo biến empno đ−ợc nhập vào,
2. Viết thủ tục nhập thông tin vào bảng message các tr−ờng
numcol1: Mã phòng
charcol1: tên phòng ban
numcol2: tổng l−ơng của phòng
3. Viết thủ tục dùng cursor; lấy số liệu về n ng−ời (n là một biến đ−ợc đ−a vào từ man hình) có mức l−ơng
cao nhất trong bảng emp đ−a vào bảng top_sal với các giá trị t−ơng ứng trong 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 của các đối t−ợng gồm các procedure, function, variable, constant, cursor và các exception.
Việc tạo các package cho phép tăng khả năng mềm dẻo, tăng tính bảo mật, tạo sự thuận lợi trong việc quản
lý hệ thống đồng thời tăng hiệu suất xử lý của hệ thống.
Để tạo package thực hiện nh− sau:
Để tạo package body thực hiện nh− sau:
Với các releases tr−ớc đây của PL/SQL việc gọi các functions chỉ có thể đ−ợc thực hiện bằng các lệnh của
procedure, nh−ng giờ thì các lời gọi này có thể xuất hiện trong câu lệnh SQL giống nh− lệnh procedure. Điều
này có nghĩa là 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 ngay bên trong Oracle Server mà ta không cần lấy dữ liệu vào trong ứng dụng
điều này làm tăng tính độc lập của cơ sở dữ liệu.
Tuy nhiên để có thể gọi đ−ợc từ SQL thì các function phải đảm bảo chắc chắn việc kiểm soát kết quả. Với
các standalone functions thì Oracle có thể thực hiện điều này bằng việc kiểm tra function body. Tuy nhiên với
body của package là ẩn cho nên các packaged functions ta phải sử dụng pragma
RESTRICT_REFERENCES để đảm bảo luật này.
Công ty cổ phần đầu t− phát triển công nghệ - FPT
Giáo trình SQL và PL/SQL
Đào tạo cơ bản: SQL và PL/SQL Trang 74
Pragma Restrict_references(, , ...)
Trong đó:
WNDS: Write no database state
RNDS: Read no database state
WNPS: Write no package state
RNPS: 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 và l−u trữ trong PL/SQL block t−ơng ứng với table. Nó đ−ợc tự động gọi đến
khi có sự truy nhập đến table t−ơng ứng với các hành động định nghĩa.
Để tạo một triger ta gõ theo có pháp sau:
Công ty cổ phần đầu t− phát triển công nghệ - FPT
Giáo trình SQL và PL/SQL
Đào tạo cơ bản: SQL và PL/SQL Trang 75
Create or replace : lệnh tạo hoặc tạo lại trigger nếu nó đã tồn tại.
Before : Chỉ ra rằng trigger sẽ đ−ợc thực hiện tr−ớc khi thực hiện lệnh.
Affter : Chỉ ra rằng trigger sẽ đ−ợc thực hiện sau lệnh gọi tới nó.
Delete, Insert, Update of on : trigger sẽ đ−ợc gọi khi có các hành động t−ơng ứng trên
từng column của bảng.
Referencing : Chỉ tên quan hệ tới các trị cũ (OLD) và mới (NEW) của row .
For each row : Trigger thực hiện t−ơng ứng với mỗi row có điều kiện ứng với mệnh đề trong
WHEN.
Pl/sql_block : Là khối lệnh PL/SQL thực hiện các xử lý theo mong muốn.
Ví dụ:
create or replace trigger t_dname before insert or update of dname on dept
for each row when (new.dname is null)
begin
if (:new.dname is null) then
:new.dname:='No Name';
end if;
end ;
22.2 Bài tập
1. Viết trigger để khi nhập số liệu vào bảng emp thì nó cũng 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
2. Thêm 1 cột vào bảng DEP tên là SUMSAL. Viết trigger để cột SUMSAL luôn chứa tổng l−ơng của phòng
ban đó ( dữ liệu lấy t−ơng ứng từ bảng emp)
3. Lập 1 bảng tên là BACKUP có cấu trúc giống bảng EMP sao cho mỗi bản ghi trong emp bị xoá sẽ l−u
sang backup
4. ứng với các theo tác insert, update, delete trên bảng emp, l−u lại các theo tác đó vào bảng message, với
dữ liệu t−ơng ứng charcol1 = tên thao tác, datecol2 = Ngày giờ thực hiện.
Công ty cổ phần đầu t− phát triển công nghệ - FPT
Giáo trình SQL và PL/SQL
Đào tạo cơ bản: SQL và PL/SQL Trang 76
23 error handing
Error handing là lỗi xuất hiện trong khối lệnh PL/SQL, tất cả các lỗi này sẽ chạy về phần EXCEPTION trong
khối lệnh để xử lý.
Khối lệnh PL/SQL gồm các thành phần
DECLARE /Không bắt buộc/
Định nghĩa các biến
BEGIN
Đoạn lệnh;
EXCEPTION /Không bắt buộc/
Hành đồng nếu 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ý các tr−ờng hợp lỗi khác
Điều kiện kích hoạt exception
Có 2 nhóm exception:
• Các exception của bản thân Oracle nh−: NO_DATA_FOUND, FOUND, TOO_MANY_ROW ...
• Các exception do ng−ời sử dụng khai báo
Các exception hệ thống tự động bị kích hoạt trong các tr−ờng hợp nhất đị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 của bản thân Oracle:
Tên Mã lỗi Mô tả
NO_DATA_FOUND ORA_01403 Câu lệnh SELECT INTO không trả về row nào
TOO_MANY_ROW ORA_01422 Câu lệnh SELECT INTO không trả về lớn hơn 1
row
INVALID_CURSOR ORA_01001 Lỗi xử lý CURSOR
ZERO_DIVIDE ORA_01476 Lỗi chia cho 0
Công ty cổ phần đầu t− phát triển công nghệ - FPT
Giáo trình SQL và PL/SQL
Đào tạo cơ bản: SQL và PL/SQL Trang 77
DUP_VAL_ON_INDEX ORA_00001 Lỗi giá trị bị trùng lắp trong một UNI QUE INDEX
Ví dụ Xoá những nhân viên trong bảng emp nếu tại phòng nhân viên đó làm việc chỉ có một nhân viên; trong
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 do 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 các exception hệ thống
Mỗi exception hệ thống đ−ợc gán một số xác định, có thể đặt tên cho các exception để dễ sử dụng hơn.
PRAGMA EXCEPTION_INIT (exception_identifier, number)
Công ty cổ phần đầu t− phát triển công nghệ - FPT
Giáo trình SQL và PL/SQL
Đào tạo cơ bản: SQL và PL/SQL Trang 78
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
1. Dùng EXCEPTION bắt lỗi chặt hơn cho các bài tập từ phần 19-22.
File đính kèm:
Đào tạo Oracle cơ bản - Giáo trình SQL và PL SQL.pdf

