HÀM
Tương tự như thủ tục, hàm (function) cũng là nhóm các lệnh PL/SQL thực hiện chức năng nào đó. Khác với thủ tục, các hàm sẽ trả về một giá trị ngay tại lời gọi của nó.
Hàm cũng có thể được lưu giữ ngay trên database dưới dạng Store procedure.
Tạo hàm
Ta có thể tạo hàm trực tiếp bằng dòng lệnh sau: Cú pháp:
CREATE [OR REPLACE] FUNCTION TenHam (ten_tham_so1 [IN hoặc OUT hoặc IN OUT] [kiểu dữ liệu], ten_tham_so2 [IN hoặc OUT hoặc IN OUT] [kiểu dữ liệu]...)
RETURN [kiểu dữ liệu]
IS hoặc AS
BEGIN
[Nội dung khối lệnh SQL và PL/SQL];
END;
CREATE OR RELACE là nếu hàm chưa được tạo thì nó sẽ tạo hàm. Còn hàm đã được tạo rồi thì nó sẽ chỉnh sửa (ALTER) lại hàm đó.
Ví dụ:
CREATE OR REPLACE FUNCTION KiemTraChanLe(so_nguyen IN number)
RETURN nvarchar2
AS
BEGIN
if (mod(so_nguyen,2) = 1 OR mod(so_nguyen,2) = -1)
then
return 'so le';
else return 'so chan';
end if;
END;
Thực hiện một hàm
Quá trình lưu giữ và biên dịch một hàm cũng tương tự như đối với một thủ tục. Quá trình gọi và thực hiện một hàm được diễn ra theo ba bước:
1. Việc gọi hàm được thực hiện ngay khi tên hàm trong biểu thức được tham chiếu tới
2. Một biến host (host variable) được tự động tạo ra để lưu giữ giá trị trả về của hàm
3. Thực hiện nội dung trong phần thân hàm, lưu lại giá trị
Ví dụ:
variable kq nvarchar2(20)
execute :kq
KiemTraChanLe(-3)
print kq
Một số hạn chế khi sử dụng hàm trong câu lệnh SQL (câu truy vấn)
Chỉ các hàm do người dùng định nghĩa được lưu trên database mới có thể sử dụng được cho câu lệnh SQL.
Các hàm do người dùng định nghĩa chỉ được áp dụng cho điều kiện thực hiện trên các dòng dữ liệu (mệnh đề WHERE), không thể áp dụng cho các điều kiện thực hiện trên nhóm (mệnh đề GROUP).
Tham số sử dụng trong hàm chỉ có thể là loại IN, không chấp nhận giá trị OUT hay giá trị IN OUT.
Kiểu dữ liệu trả về của các hàm phải là kiểu dữ liệu DATE, NUMBER, NUMBER. Không cho phép hàm trả về kiểu dữ liệu như BOOLEAN, RECORD, TABLE. Kiểu dữ liệu trả về này phải tương thích với các kiểu dữ liệu bên trong Oracle Server.
Huỷ bỏ hàm
Tương tự như việc tạo hàm, ta có thể huỷ bỏ hàm thông qua câu lệnh SQL. Cú pháp:
DROP FUNCTION TenHam;
Các kiểu dữ liệu cơ bản
Kiểu CHAR: Kiểu CHAR dùng để khai báo một chuỗi có chiều dài cố định, khi khai báo biến hoặc cột kiểu CHAR với chiều dài chỉ định thì tất cả các mục tin của biến hay cột này đều có cùng chiều dài được chỉ định. Các mục tin ngắn hơn Oracle sẽ tự động thêm vào các khoảng trống cho đủ chiều dài. Oracle không cho phép gán mục tin dài hơn chiều dài chỉ định đối với kiểu CHAR. Chiều dài tối đa cho phép của kiểu CHAR là 255 byte.
Kiểu VARCHAR2: Kiểu VARCHAR2 dùng để khai báo chuỗi ký tự với chiều dài thay đổi. Khi khai báo một biến hoặc cột kiểu VARCHAR2 phải chỉ ra chiều dài tối đa, các mục tin chứa trong biến hay cột kiểu VARCHAR2 có chiều dài thực sự là chiều dài của mục tin. Oracle không cho phép gán mục tin dài hơn chiều dài tối đa chỉ định đối với kiểu VARCHAR2. Chiều dài tối đa kiểu VARCHAR2 là 2000 byte.
Kiểu VARCHAR: Hiện tại Oracle xem kiểu VARCHAR2 và VARCHAR là như nhau, tuy nhiên Oracle khuyên nên dùng VARCHAR2. Oracle dự định trong tương lai dùng kiểu VARCHAR để chứa các chuỗi với chiều dài biến đổi, nhưng trong phép so sánh sẽ được chỉ định theo nhiều ngữ nghĩa khác nhau.
Kiểu NUMBER: Kiểu số của Oracle dùng để chứa các mục tin dạng số dương, số âm, số với dấu chấm động.
NUMBER(p, s)
p: Số chữ số trước dấu chấm thập phân (precision), p từ 1 đến 38 chữ số
s: Số các chữ số tính từ dấu chấm thập phân về bên phải (scale), s từ -84 đến 127
NUMBER(p) Số có dấu chấm thập phân cố định với precision bằng p và scale bằng 0
NUMBER Số với dấu chấm động với precision bằng 38. Nhớ rằng scale không được áp dụng cho số với dấu chấm động.
Kiểu FLOAT: Dùng để khai báo kiểu số dấu chấm động, với độ chính xác thập phân 38 hay độ chính xác nhị phân là 126.
FLOAT(b) Khai báo kiểu dấu chấm động với độ chính xác nhị phân là b, b từ 1 đến 126. Có thể chuyển từ độ chính xác nhị phận sang độ chính xác thập phân bằng cách nhân độ chính xác nhị phân với 0.30103
Kiểu LONG: Dùng để khai báo kiểu chuỗi ký tự với độ dài biến đổi, chiều dài tối đa của kiểu LONG là 2 gigabyte. Kiểu LONG thường được dùng để chứa các văn bản.
Kiểu DATE: Dùng để chứa dữ liệu ngày và thời gian. Mặc dù kiểu ngày và thời gian có thể được chứa trong kiểu CHAR và NUMBER.
Với giá trị kiểu DATE, những thông tin được lưu trữ gồm thế kỷ, năm, tháng, ngày, giờ, phút, giây. Oracle không cho phép gán giá trị kiểu ngày trực tiếp, để gán giá trị kiểu ngày, bạn phải dùng TO_DATE để chuyển giá trị kiểu chuỗi ký tự hoặc kiểu số. Đối với dữ liệu kiểu ngày, bạn có thể thực hiện các phép toán cộng và trừ. Ví dụ:
SYSDATE+1 ngày hôm sau
SYSDATE-7 cách đây một tuần
SYSDATE+(10/1440) mười phút sau
Chuyển đổi kiểu
Chuyển đổi mặc định:
Nói chung một biểu thức không thể gồm các giá trị thuộc nhiều kiểu khác nhau, tuy nhiên Oracle cho phép chuyển đổi giưã các kiểu dữ liệu. Oracle tự động chuyển kiểu của dữ liệu trong một số trường hợp sau
Khi INSERT hoặc UPDATE gán giá trị cho cột có kiểu khác, Oracle sẽ tự động chuyển giá trị sang kiểu của cột.
Khi sử dụng các hàm hoặc các toán tử mà các tham số có kiểu không tương thích thì Oracle sẽ tự động chuyển kiểu.
Khi sử dụng toán tử so sánh mà các giá trị có các kiểu khác nhau, Oracle sẽ tự động chuyển kiểu.
Người sử dụng tự chuyển đổi:
Oracle cung cấp các hàm để chuyển đổi kiểu, ví dụ
TO_NUMBER Chuyển sang kiểu số
TO_CHAR Chuyển sang kiểu ký tự
TO_DATE Chuyển sang kiểu ngày
LỆNH LẬP TRÌNH PL/SQL ĐƠN GIẢN
Lệnh IF: Thực hiện câu lệnh theo điều kiện.
Cú pháp:
IF <điều kiện 1> THEN
Công việc 1;
[ELSIF <điều kiện 2> THEN
Công việc 2;
]
[ELSE
Công việc n + 1;
]
END IF;
Ví dụ:
if (mod(so_nguyen,2) = 1 OR mod(so_nguyen,2) = -1)
then
return 'so le';
else return 'so chan';
end if;
Lệnh lặp LOOP không định trước
Trong lệnh lặp này, số lần lặp tuỳ thuộc vào điều kiện kết thúc vòng lặp và không xác định được ngay tại thời điểm bắt đầu vòng lặp.
Cú pháp:
LOOP
Công việc;
EXIT WHEN điều kiện;
END LOOP;
Ví dụ:
x
0;
y
1000;
LOOP
x
x + 1;
y
y - x;
EXIT x > y;
END LOOP;
Lệnh lặp LOOP có định trước
Ngay khi bắt đầu vòng lặp, ta đã xác định được số lần lặp. Cú pháp:
LOOP Index IN Cận dưới .. Cận trên
Công việc;
END LOOP;
Ví dụ:
x
0;
LOOP Index IN 1 .. 100
x
x + 1;
END LOOP;
Lệnh lặp WHILE
Cú pháp:
WHILE Điều kiện LOOP
Công việc;
END LOOP;
Ví dụ:
WHILE length(:Address) < 50 LOOP
:Address
:Address || ‘ ‘;
END LOOP;
GIỚI THIỆU CURSOR
Các bước sử dụng biến cursor:
Khai báo --> mở cursor --> lấy dữ liệu để xử lý --> đóng cursor
Khai báo:
CURSOR Tên cursor( danh sách biến) IS Câu lệnh truy vấn;
Mở cursor:
OPEN Tên cursor | Tên cursor( danh sách biến);
Lấy dữ liệu:
FETCH Tên cursor INTO Tên biến;
Đóng cursor:
CLOSE Tên cursor;
Các thuộc tính:
%isopen: trả lại giá trị True nếu cursor đang mở
%notfound: trả lại giá trị True nếu lệnh fetch hiện thời trả
lại không có row
%found: trả lại giá tri true cho đến khi fetch không còn
row nào
%rowcount: trả lại số row đã được thực hiện bằng lệnh fetch
Ví dụ:
DECLARE
-- Khai báo cursor để truy vấn dữ liệu CURSOR c_Emp IS
SELECT *
FROM emp
WHERE dept_id = 10;
-- Khai báo biến cursor tương ứng để chứa dòng dữ liệu v_Emp c_EMP%rowtype;
BEGIN
-- Mở cursor
OPEN c_Emp;
LOOP
-- Lấy dòng dữ liệu từ cursor
FETCH c_Emp INTO v_Emp;
-- Thoát khỏi vòng lặp nếu đã lấy hết dữ liệu trong cursor
EXIT WHEN c_Emp%notfound;
-- Bổ sung dữ liệu vào Emp_ext theo dữ liệu lấy được từ
cursor
INSERT INTO Emp_ext (empno, ename, job) VALUES (v_Emp.empno, v_Emp.ename, v_Emp.job); END LOOP;
-- Đóng cursor
CLOSE c_Emp;
END;
RETURN a TABLE
Trong Oracle, để trả về một table, ta phải tự định nghĩa kiểu dữ liệu table. Đầu tiên là định nghĩa một dòng sẽ gồm những thuộc tính nào:
create or replace type dong as object
(
MS varchar2(10),
HoTen varchar2(30), Dùng nvarchar2 không được! (Chưa biết lý do, chắc không hỗ trợ)
Diem number
);
Kế đến dùng TABLE OF để định nghĩa kiểu dữ liệu table (của những thuộc tính trên):
create or replace type bang as table of dong;
Lúc này kiểu dữ liệu table đã được hiểu, ta có thể viết FUNCTION trả về table:
CREATE OR REPLACE FUNCTION InSinhVien (ma_SV varchar2)
RETURN bang
AS
t bang
bang(); -Bảng t vừa được khởi tạo với 3 thuộc tính trên, nhưng chưa có dòng nào.
BEGIN
FOR cur IN (Select * From SINH_VIEN Where MSSV = ma_SV) LOOP dùng cursor để lấy dữ liệu.
t.Extend; --Thêm vào cho bảng t một dòng với dữ liệu của 3 thuộc tính đều là NULL
t(t.Last)
dong(cur.MSSV, cur.HoTen, cur.Diem);
--Truyền dữ liệu cho table (thay NULL bằng dữ liệu của cursor)
END LOOP; Thoát vòng lặp
return t;
END;
Cuối cùng dùng TABLE để Select table của mình ra màn hình: (không cần execute hay khởi tạo biến table)
SELECT *
FROM TABLE(InSinhVien(‘0867069’));
Chú thích thêm:
Ở kiểu dữ liệu table, ta có quyền truy xuất đến một dòng bất kỳ bằng cách truyền số nguyên index vào:
table_name(parameters)
VD: t(1): dòng 1, t(2): dòng 2
Các mode đối với kiểu dữ liệu table:
EXISTS(n) Trả về TRUE nếu có phần tử tồn tại trong plsql table.
COUNT Số phần tử (số dòng) trong plsql table
FIRST First chỉ đến dòng đầu và Last chỉ đến dòng cuối của plsql table
LAST (sẽ trả về NULL nếu table rỗng)
PRIOR(n) trả về dòng đứng trước n trong plsql table
NEXT(n) trả về dòng kế tiếp của n trong plsql table
EXTEND(n,i) Thêm vào n bản copy của phần tử (dòng) 'i' vào trong plsql table
i mặc định là NULL còn n mặc định là 1
TRIM(n) Cắt n phần tử (dòng) từ cuối của plsql table, n mặc định là 1
DELETE(m,n) Xóa các phần tử trong vùng từ m đến n
m mặc định bằng = n, n n mặc định là tất cả.
PHẦN BÀI LÀM:
Những câu không return table
1. Nhận vô 2 mốc thời gian và 1 hình thức ngân sách (Dự kiến hay Thực tế) rồi tự động tính toán tổng chi phí tiếp thị phát sinh trong khoảng thời gian giữa 2 mốc thời gian ấy, có 2 trường hợp:
- Nếu có truyền vào IDChiPhi thì chỉ tính tổng chi phí thuộc loại của IDChiPhi.
- Nếu không truyền vào IDChiPhi thì tính tổng chi phí toàn bộ.
Kết quả tính toán lưu thành 1 dòng DL trong bảng TongHopNganSach.
Hướng dẫn :
8. Nhận vô một ID của một hoạt động, tính tổng thời gian dự kiến diễn ra hoạt động ấy (tính theo đơn vị ngày). Kết quả xuất ra dạng tham số output.
Hướng dẫn :
Table: ChiTietHoatDong
IDHoatDong ID nhận vô
Tổng thời gian dự kiến: NgayGioDKBatDau NgayGioDKKetThuc
10. Nhận vô một ID của một nhân viên và 2 mốc thời gian rồi tính tổng thời gian (tính theo đơn vị ngày) nhân viên ấy tham gia các hoạt động rơi vào trong khoảng thời gian giữa 2 mốc thời gian này. Kết quả xuất ra dạng tham số output.
Hướng dẫn :
Table: ChiTietHoatDong join NhanVienHoatDong
IDNhanVien ID nhận vô (lấy ra những nhân viên mong muốn)
Tổng thời gian nhân viên ấy tham gia các hoạt động: SUM(NgayGioDKBatDau NgayGioDKKetThuc)
15. Nhận vô ID của một khách hàng, đếm tổng số khúc thị trường mà khách hàng này thuộc về, kết quả xuất ra dạng tham số output.
Hướng dẫn :
Table: KHTrongKhucTT join KhucThiTruong
IDKhachHang ID nhận vô
Count(*)
16. Nhận vô ID của một khách hàng, tính tổng doanh thu của khách hàng này, tổng doanh thu là tổng giá trị tất cả hóa đơn mà khách hàng đã thanh toán. Kết quả được cập nhật vào bảng KhachHang và đồng thời xuất ra dạng tham số output.
Hướng dẫn :
Table: HoaDon
Tổng doanh thu: cho IDKhachHang ID nhận vô rồi lấy SUM(TongGT)
17. Nhận vô ID của một sản phẩm, tính tổng doanh thu của sản phẩm này, tổng doanh thu là tổng giá trị tất cả chi tiết hóa đơn mà khách hàng đã thanh toán cho sản phẩm này. Kết quả được xuất ra dạng tham số output.
Hướng dẫn :
Table: ChiTietHoaDon join HoaDon
Tổng doanh thu: cho IDSanPham ID nhận vô rồi lấy SUM(TongGT)
18. Nhận vô ID một hợp đồng, tính tổng giá trị hợp đồng ấy. Kết quả được cập nhật vào bảng HopDong và đồng thời xuất ra dạng tham số output.
Hướng dẫn :
- Giá trị hợp đồng là tổng các giá sau thuế của các chi tiết hợp đồng
- Giá sau thuế = Đơn giá x Số lượng – Tiền chiết khấu + Tiền thuế
- Tiền chiết khấu = (Đơn giá x Số lượng) x Phần trăm chiết khấu
- Tiền thuế = (Đơn giá x Số lượng – Tiền chiết khấu) x Thuế suất
Table: ChiTietHopDong join ThueSuat, HopDong (để update)
Đơn giá: ChiTietHopDong.GiaBan
Số lượng: ChiTietHopDong.SoLuong
Phần trăm chiết khấu: ChiTietHopDong.ChietKhau
Thuế suất: ThueSuat.PhanTram
Sau khi tính xong giá sau thuế, ta gộp tất cả các phép tính vào trong hàm SUM(phép tính giá sau thuế) rồi đưa vào câu truy vấn khi IDHopDong ID nhận vô
Sau đó tiến hành update, ghi kết quả trả về của câu truy vấn vào thuộc tính TongGT trong bảng HopDong, đồng thời return kết quả đó.
19. Nhận vô ID một đơn hàng, tính tổng giá trị đơn hàng ấy. Kết quả được cập nhật vào bảng DonHang và đồng thời xuất ra dạng tham số output. Cách tính tương tự như với hợp đồng.
Hướng dẫn : Tương tự như câu trên, chỉ khác table
Table: ChiTietDonHang join ThueSuat, DonHang (update)
20. Nhận vô ID một hóa đơn, tính tổng giá trị hóa đơn ấy. Kết quả được cập nhật vào bảng HoaDon và đồng thời xuất ra dạng tham số output. Cách tính tương tự như với hợp đồng.
Hướng dẫn : Tương tự như câu trên, chỉ khác table
Table: ChiTietHoaDon join ThueSuat, HoaDon (update)
25. Nhận vô ID của một nhân viên, tính tổng doanh thu mà nhân viên này mang về cho công ty. Tổng doanh thu là tổng giá trị các hợp đồng ký với các khách hàng do nhân viên này phụ trách.
Hướng dẫn :
Table: HopDong
Tính SUM(TongGT) trong câu truy vấn với điều kiện IDNhanVien ID nhận vô
Những câu có return table
2. Nhận vô 2 mốc thời gian và liệt kê các khách hàng có ngày sinh rơi vào trong khoảng thời gian giữa 2 mốc thời gian ấy. Thông tin khách hàng in ra gồm : ID, tenKH, TenDayDu.
Hướng dẫn :
Table: KhachHang
Định nghĩa dòng: 3 thuộc tính: ID varchar2(15), TenKH varchar2(50), TenDayDu varchar2(100)
Truy vấn những khách hàng có NgaySinh between [mốc thời gian 1 nhận vô] and [mốc thời gian 2 nhận vô] rồi trả về.
3. Nhận vô 2 mốc thời gian và liệt kê các khách hàng có ngày thành lập công ty rơi vào trong khoảng thời gian giữa 2 mốc thời gian ấy. Thông tin khách hàng in ra gồm : ID, tenKH, TenDayDu.
Hướng dẫn :
Tương tự câu 2, thay NgaySinh bằng NgayThanhLapCongTy.
4. Nhận vô 2 mốc thời gian và liệt kê các khách hàng có ngày tìm thấy rơi vào trong khoảng thời gian giữa 2 mốc thời gian ấy. Thông tin khách hàng in ra gồm : ID, tenKH, TenDayDu.
Hướng dẫn :
Tương tự câu 2, thay NgaySinh bằng NgayTimThay.
5. Nhận vô 2 mốc thời gian và liệt kê các khách hàng có ngày liên hệ gần nhất rơi vào trong khoảng thời gian giữa 2 mốc thời gian ấy. Thông tin khách hàng in ra gồm : ID, tenKH, TenDayDu.
Hướng dẫn :
Tương tự câu 2, thay NgaySinh bằng NgayLienHeGanNhat.
6. Nhận vô 2 mốc thời gian và liệt kê các khách hàng có ngày liên hệ kế tiếp rơi vào trong khoảng thời gian giữa 2 mốc thời gian ấy. Thông tin khách hàng in ra gồm : ID, tenKH, TenDayDu.
Hướng dẫn :
Tương tự câu 2, thay NgaySinh bằng NgayLienHeKeTiep.
7. Nhận vô 2 mốc thời gian và một hình thức hoạt động rồi liệt kê các hoạt động thuộc hình thức ấy và có ngày dự kiến rơi vào trong khoảng thời gian giữa 2 mốc thời gian này. Thông tin in ra gồm : ID, TieuDe, NoiDung, NgayDuKien.
Hướng dẫn :
Table: HoatDong
Định nghĩa dòng: 4 thuộc tính: ID varchar2(15), TieuDe varchar2(50), NoiDung varchar2(3000), NgayDuKien date
Mặc định ngày tháng là DDMONYYYY, ví dụ: 21-Jun-1990
Truy vấn những khách hàng có NgayDuKien between [mốc thời gian 1 nhận vô] and [mốc thời gian 2 nhận vô] and HinhThuc [hình thức nhận vô] rồi trả về.
12. Nhận vô ID của một đối thủ cạnh tranh, xuất ra danh sách các sản phẩm của ta mà đối thủ có sản xuất sản phẩm cùng nhóm. Thông tin xuất ra gồm : ID, tên sản phẩm, tên nhóm sản phẩm, giá cơ bản.
Hướng dẫn :
Table: SanPham SP_Ta join SanPham SP_DoiThu (join thêm NhomSanPham để lấy ra tên nhóm sản phẩm), với:
SP_Ta: gồm những sản phẩm có LaSPCuaTa 1
SP_DoiThu: gồm những sản phẩm có IDDoiThu ID nhận vô
Điều kiện join: IDNhomSanPham bằng nhau
Định nghĩa dòng: 4 thuộc tính: ID varchar2(15), TenSanPham varchar2(50), TenNhomSanPham varchar2(100), GiaCoBan float.
13. Nhận vô ID của một đối thủ cạnh tranh, xuất ra danh sách các tiến trình bán hàng mà đối thủ đang cạnh tranh với ta. Thông tin xuất ra gồm : ID, tiêu đề, diễn giải, tên khách hàng.
Hướng dẫn :
Table: DoiThu_TienTrinhBH join TienTrinhBanHang (join thêm KhachHang để lấy TenKH)
Định nghĩa dòng: 4 thuộc tính: ID varchar2(15), TieuDe varchar2(50), DienGiai varchar2(256), TenKhachHang varchar2(50).
DoiThu_TienTrinhBH.IDDoiThu ID nhận vô and IDKhachHang KhachHang.ID
------ Insert ------
--KhachHang:
Insert into KhachHang values
('KH1','Khach hang mot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,'0',NULL,'NV1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,'VN',NULL,NULL,NULL,NULL,to_date('17-MAY-2010 07:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('17-MAY-2010 11:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('17-MAY-2010 13:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('17-MAY-2010 17:00:00', 'dd/MM/yyyy hh24:mi:ss')
,to_date('18-MAY-2010 07:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('18-MAY-2010 11:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('18-MAY-2010 13:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('18-MAY-2010 17:00:00', 'dd/MM/yyyy hh24:mi:ss')
,to_date('19-MAY-2010 07:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('19-MAY-2010 11:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('19-MAY-2010 13:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('19-MAY-2010 17:00:00', 'dd/MM/yyyy hh24:mi:ss')
,to_date('20-MAY-2010 07:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('20-MAY-2010 11:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('20-MAY-2010 13:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('20-MAY-2010 17:00:00', 'dd/MM/yyyy hh24:mi:ss')
,to_date('21-MAY-2010 07:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('21-MAY-2010 11:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('21-MAY-2010 13:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('21-MAY-2010 17:00:00', 'dd/MM/yyyy hh24:mi:ss')
,to_date('22-MAY-2010 07:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('22-MAY-2010 11:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('22-MAY-2010 13:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('22-MAY-2010 17:00:00', 'dd/MM/yyyy hh24:mi:ss')
,to_date('23-MAY-2010 07:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('23-MAY-2010 11:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('23-MAY-2010 13:00:00', 'dd/MM/yyyy hh24:mi:ss'),to_date('23-MAY-2010 17:00:00', 'dd/MM/yyyy hh24:mi:ss')
,'15-MAY-2010','Nguyen Mai Khanh')
--NhanVien:
Insert into NhanVien values
('NV1','Nhan vien mot',NULL,'0','01-APR-98',NULL,'N1','5','0',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','01-Jan-2010','Nguyen Mai Khanh')
HopDong
Insert into HOPDONG values
('HD1','Hop dong mot','0','KH1',NULL,'1-Jun-1990',NULL,'NV1',NULL,'Nhan vien mot','Khach hang mot'
,'1-Jun-1990',NULL,NULL,'VND',NULL,NULL,NULL,NULL,NULL,NULL,'15-May-1990','Nguyen Mai Khanh')