IV. Quản trị thành phần
1. Tạo bảng đối tượng
Một bảng đối tượng là một kiểu bảng đặc biệt lưu giữ các đối tượng. Để tạo bảng đối tượng ta dùng CREATE TABLE. Ta có thể dễ dàng chèn thêm, cập nhật, xóa hay truy vấn đối tượng bằng câu lệnh SQL như: INSERT, UPDATE, DELETE, SELECT... Bảng đối tượng có thể có dạng:
- Bảng dữ liệu mà có các cột có kiểu Object
-Bảng dữ liệu từ một kiểu Object. Các cột của bảng gồm các thuộc tính của đối tượng, các dòng của bảng xem như là một đối tượng.
Làm việc với kiểu Object mạnh hơn nhiều so với kiểu dữ liệu thông thường. Dữ liệu được lưu trong bảng không đơn thuần chỉ là những cột hay dòng dữ liệu tĩnh, mà là một đối tượng biết cách ứng xử và thể hiện dữ liệu do chúng bao bọc.
Ví dụ:
Hệ quản trị cơ sở dữ liệu Oracle
Tạo bảng đối tượng KhachHang
CREATE OR REPLACE TYPE KhachHang AS OBJECT ( tenDangNhap VARCHAR2(10),
matKhau VARCHAR2(10), hoTen VARCHAR2(30), email VARCHAR2(50));
Tạo bảng KhachHang_T
CREATE TABLE KhachHang_T OF KhachHang
Hiển thị các khách hàng có trong bảng KhachHang_T SELECT * FROM KhachHang_T
//Chèn khách hàng vào bảng KhachHang_T INSERT INTO KhachHang_T
values(‘hoa’,’hoa’,’Nguyễn Thị Hoa’,‘hoa2006@yahoo.com’);
Xóa khách hàng trong bảng KhachHang_T
DELETE FROM KhachHang_T WHERE tenDangNhap = ‘hoa’;
Sửa thông tin khách hàng trong bảng
KhachHang_TUPDATE KhachHang_T SET email = ‘hoant@yahoo.com’
WHERE tenDangNhap = ‘hoa’;
2. Bảng lồng (Nested table)
Bảng lồng nhau là một tập hợp những phần tử dữ liệu không có thứ tự, có cùng kiểu dữ liệu. Định nghĩa kiểu bảng lồng không phân bổ không gian. Nó xác định kiểu dữ liệu mà bạn có thể sử dụng làm:
Kiểu dữ liệu cột của bảng quan hệ.
Thuộc tính của kiểu đối tượng
Biến, tham đối PL/SQL hoặc hàm trả về kiểuVới bảng lồng, các thành phần thực sự lưu trữ trong bảng riêng (bảng lồng). Nếu kiểu thành phần là kiểu định nghĩa sẵn, bảng lồng có một cột với kiểu này, hay nếu kiểu thành phần là kiểu đối tượng, bảng có thể xem như là bảng nhiều cột, mỗi cột cho mỗi thuộc tính của kiểu đối tượng. Bảng lồng chứa thêm một cột định nghĩa hàng bảng cha hay đối tượng mà mỗi thành phần thuộc về.
Có thể sử dụng bảng lồng định nghĩa cho một thuộc tính của kiểu đối tượng
Các kiểu nhóm - gồm các thành phần có cùng kiểu - hỗ trợ trong Oracle là Varray, bảng lồng. Oracle mô hình hoá kiểu nhóm như là quan hệ tụ hợp, hợp thành, thuộc tính đa trị trong đối tượng phức hợp
Ví dụ:
Định nghĩa quan hệ tụ hợp giữa kiểu đối tượng DonHang và DonHangCT sử dụng bảng lồng
soLuong NUMBER, maHangRef ref MatHang);
CREATE TYPE DonHangCT_T AS TABLE OF DonHangCT;
CREATE OR REPLACE TYPE DonHang AS OBJECT (
maDH NUMBER, ngayMua DATE, ngayGiao DATE, tenDangNhapRef ref KhachHang, dHCT DonHangCT_T);
CREATE TABLE DonHang_T OF DonHang NESTED TABLE dHCT STORE AS DSDHCT;
Thêm dữ liệu, cập nhật dữ liệu và xoá dữ liệu từ bảng DonHang_T INSERT INTO DonHang_T VALUES
(1,sysdate, to_date(‘9/6/2005’,’dd/mm/yyyy’), null, DonHangCT_T (DonHangCT (1,null),DonHangCT(3,null)));
UPDATE DonHang_T SET tenDangNhapRef = (SELECT REF(k) FROM KhachHang_T k WHERE k.hoTen = ‘Nguyen Thi Thu’ );
UPDATE TABLE (SELECT dHCT FROM DonHang_T WHERE maDH=1) SET maHangRef = (SELECT ref(h) FROM MatHang_T m where
m.maHang=1);
DELETE FROM DonHang_T where maDH = 1;
3. Kiểu mảng (Varray Type)
Mảng là một tập hợp có thứ tự của những phần tử dữ liệu. Tất cả những phần tử của một mảng thuộc cùng kiểu dữ liệu. Mỗi phần tử có một chỉ mục là số tương ứng với vị trí của phần tử trong mảng. Số phần tử trong một mảng là kích thước của mảng. Oracle cho phép các mảng có kích thước khả biến, đó là lý do tại sao chúng được gọi là VARRAY.
Tạo một kiểu mảng không phân bổ không gian. Nó xác định kiểu dữ liệu mà bạn có thể sử dụng làm:
- Kiểu dữ liệu cột của một bảng quan hệ - Một thuộc tính kiểu đối tượng
- Biến, tham đối PL/SQL hoặc hàm trả về kiểu Ví dụ:
Định nghĩa mảng DienThoai kiểu VARRAY
CREATE OR REPLACE TYPE DienThoai AS VARRAY(3) OF VARCHAR2(20);
Kiểu mảng DienThoai có số phần tử không nhiều hơn 3, có kiểu dữ liê ̣u phần tử là varchar2(20).
Ví dụ:
Định nghĩa kiểu đối tượng KhachHang, DiaChi
Quan hệ hợp thành giữa kiểu đối tượng KhachHang và kiểu đối tượng DiaChi
Hệ quản trị cơ sở dữ liệu Oracle
CREATE OR REPLACE TYPE DiaChi AS OBJECT (
soNha VARCHAR2(15), duong VARCHAR2(25), thanhPho VARCHAR2(25), quocGia VARCHAR2(25));
CREATE OR REPLACE TYPE KhachHang AS OBJECT
(tenDangNhap VARCHAR2(10), matKhau VARCHAR2(10), hoTen VARCHAR2(30), diaChis DiaChi, dienThoais DienThoai, email VARCHAR2(50));
CREATE TABLE KhachHang_T OF KhachHang;
Chèn dữ liệu vào bảng KhachHang_T
INSERT INTO KhachHang_T VALUES (‘hoa’, ’hoa’, ’Nguyen Thi Hoa’, DiaChi(‘202’,’Le Loi’,’Da nang’,’Viet Nam’), DienThoai(‘750666’, ‘123456’), null);
Truy vấn dữ liệu từ bảng KhachHang_T
SELECT hoTen, k.diaChis.soNha, k.diaChis.duong, k.diaChis.thanhPho, k.diaChis.quocGia, dt.* FROM KhachHang_T k, table(k.dienThoais) dt
WHEREtenDangNhap = ‘hoa’;
Cập nhật dữ liệu từ bảng KhachHang_T
UPDATE KhachHang_T SET email = ‘hoaNT@yahoo.com’
WHERE tenDangNhap = ‘hoa’
Xóa dữ liệu từ bảng KhachHang_T
DELETE FROM KhachHang_T where tenDangNhap = ’hoa’;
4. Kiểu tham chiếu Ref (Reference)
Trong mô hình quan hê ̣, ta đã sử dụng kỹ thuật tham chiếu dưới hình thức thiết lập các khóa ngoại để liên kết các bảng với nhau. Nhưng với mô hình đối tượng thì việc tham chiếu không cần đến các khóa, bạn chỉ cần cho biết một thuộc tính nào đó của đối tượng mang kiểu con trỏ (REF) tham chiếu đến một đối tượng khác. Thậm chí có thể xây dựng những kiểu Object mang tính đệ quy (Recursive Object) nghĩa là bản thân Object mang những thuộc tính có kiểu con trỏ trỏ đến chính nó.
Oracle mô hình hoá kiểu tham chiếu REF như là quan hệ kết hợp, quan hệ kế thừa. Cơ chế tham chiếu và dùng chung (Sharing) các đối tượng dưới hình thức con trỏ (By Ref) sẽ nhanh hơn nhiều so với cơ chế tham chiếu theo trị (By Value) như trong mô hình quan hệ.
Với quan hệ kết hợp, trong kiểu đối tượng bên nhiều sẽ tạo thuộc tính kiểu tham chiếu đến kiểu đối tượng bên 1
Với quan hệ kế thừa, trong kiểu đối tượng con, sẽ tạo thuộc tính kiểu tham chiếu đến kiểu đối tượng cha
Ví dụ 1:
Định nghĩa kiểu đối tượng LoaiHang, MatHang
Quan hệ kết hợp 1 nhiều 1 chiều giữa kiểu đối tượng LoaiHang và MatHang
CREATE OR REPLACE TYPE LoaiHang AS OBJECT ( maLoai NUMBER, tenLoai VARCHAR2(25), hinh VARCHAR2(50));
CREATE TABLE LoaiHang_T OF LoaiHang;
CREATE OR REPLACE TYPE MatHang AS OBJECT ( maHang NUMBER, tenHang VARCHAR2(50), moTa VACHAR2(2000), hinh VARCHAR2(50), donGia NUMBER, giamGia NUMBER, maLoaiRef ref Loaihang);
CREATE TABLE MatHang_T OF MatHang;
Truy xuất đối tượng được tham chiếu bằng một REF được gọi là giải tham chiếu. Oracle cung cấp toán tử DEREF để thưc hiện điều này.
Truy vấn bảng MatHang_T
SELECT tenHang, moTa, DEREF(maLoaiRef).tenLoai
FROM MatHang_T WHERE DEREF(maLoaiRef).maLoai = 1;
Chèn, cập nhật dữ liệu vào bảng MatHang_T
INSERT INTO MatHang_T VALUES(1, ‘Giường kiểu Hoa Cúc La Mã’,
‘Những bông hoa được chạm trổ rất đẹp’, ’hinh.jpg’, 450000, 0, null);
UPDATE MatHang_T SET maLoaiRef =
(SELECT REF(l) FROM LoaiHang_T l WHERE l.maLoai = 1) WHERE maHang = 2;
Xóa dữ liệu từ bảng MatHang_T
DELETE FROM MatHang_T WHERE maHang = 2;
Ví dụ 2:
Quan hệ kế thừa giữa kiểu đối tượng VeChon kế thừa LoaiVe
CREATE OR REPLACE TYPE VeChon AS OBJECT (veChonid NUMBER, tangGia NUMBER, loaiVeRef ref LoaiVe);
CREATE TABLE VeChon_T OF VeChon;
Khi đối tượng tham chiếu bị hủy bỏ thì thuộc tính tham chiếu đến đối tượng không có thực, trường hợp này là dangling. Ví dụ khi bạn xóa đi một loại hàng trong bảng LoaiHang_T thì các đối tượng tương ứng trong bảng MatHang_T đều trỏ đến một loại hàng không có thực, để tránh trường hợp này bạn có thể sử dụng lệnh UPDATE đặt các thuộc tính tham chiếu về null như sau:
UPDATE MatHang_T SET maLoaiRef = null WHERE maLoaiRef is dangling;
5. Câu lệnh tạo VIEW
CREATE VIEW view_name as
SELCET COLUMNS FROM TABLES WHERE conditions;
Câu lệnh update:
Hệ quản trị cơ sở dữ liệu Oracle
Lệnh này sẽ tạo view mới nếu chưa tồn tại, hoặc cập nhật view cũ nếu đã tồn tại.
Xem lại VIEW:
View cũng là một dạng table nên bạn có thể sử dụng lệnh SELECT.
SELECT * FROM sup_orders;
6. Trigger Khái niệm
Triggers là một khối chứa các mã lệnh nhằm thực hiện một chức năng nào đó trong chương trình ứng dụng. Tất các các trigger đều có tên và chứa một hoặc nhiều dòng lệnh PL/SQL tương ứng với sự kiện mà nó phải xử lý.
Tên Trigger thường tương ứng với sự kiện (ví dụ When-Button-Pressed trigger sẽ tương ứng với sự kiện nhấn vào Button.
Một trigger Phải được gắn với một object xác định trên form: item, block hoặc chính trên form. Trigger gồm các mức (level) tương ứng:
Việc xác định mức đặt các trigger là rất quan trọng bởi vì nó xác định phạm vi hoạt động của trigger ứng với các sự kiện (events). Ví dụ Item-level trigger chi bật lên (fire) ứng với các sự kiện trên item. Nó không được bật lên ứng với sự kiện như vậy trên item khác cùng hay không cùng thuộc một block. Block-level trigger chi bật lên nếu có sự kiện xuất hiện trong block nhưng nó không bật lên khi xuất hiện các sự kiện giông như vậy thuộc block khác.
Ở cùng một mức các trigger cùng xuất hiện và xử lý với các cách khác nhau. Có các loại trigger sau: Pre-, Post-,When
Tạo và xóa một trigger
Trên cửa sổ Object Navigator ứng với mồi object (item, block, form) sẽ có mục Triggers.
Ta chuyển hộp chọn vào Triggers sau đỏ nhấn vào biểu tượng Create để tạo mới và chọn sự kiện tương ứng ( ví dụ when-button-pressed ) sau đó hiện lên cửa sổ viết mã.
Pre -triggers:
Các loại trigger này được kích hoạt trước các giao tác của cơ sở dữ liệu, hoặc các sự kiện của form. Chúng chứa dựng các phát biểu bố xung, các phát biểu này được thực thi trước khi hoạt động xảy ra. Không giông như trigger on chúng không thay thê các hoạt dộng bình thường của form. Ví dụ như trigger pre-insert được kích hoạt khi phát biêu insert được thực hiện
Một số trigger loại này hay dùng như:
pre-insert: được thực hiện trước khi quá trình insert thực hiện pre-delete: được thực hiện trước khi quá trình delete thực hiện
pre-update: được thực hiện trước khi quá trình update thực hiện pre-form: trước khi form được khởi động
When - triggers:
Các loại trigger này dược kích hoạt khi một hoạt động của form xảy ra. Ví dụ như trigger when-new-form-instance dược kích hoạt khi form dược khởi dộng đâu tiên
Một số trigger loại này hay được sử dụng:
- When-button-pressed: Được thực hiện khi có thao tác nhấn button bằng phím hoặc chuột
- When-clear-block: Thực hiện khi xoá dữ liệu từ block hiện thời - When-create-record: Thực hiện khi tạo một bàn ghi mới
- When-checkbox-change: Thực hiện khi check box thay đổi trạng thái - When-radio-change: Thực hiện khi cỏ thay đổi chọn các radio button - When-list-change: Thực hiện khi thay đổi chọn giá trị trong danh sách.
- When-ne\v-block-instance: Được thực hiện khi di chuyển input focus từ một block từ block khác
- When-ne\v-item-instance: Được thực hiện khi con trò chuyển tới Item
- When-validate-item: Xuất hiện khi có nhừng thay đối giá trị cùa item từ người sử dụng hoặc từ các trigger và khi con trỏ di chuyên ra khỏi item.
Post - Triggers:
Các loại trigger này kích hoạt sau các giao tác cũa cơ sở dừ liệu hoặc các sự kiện cùa form. Chúng chứa đựng các phát biêu bô xung, các phát biêu này được thực thi sau khi hoạt động xảy ra. Không giống như trigger on, chúng không thay thế các hoạt
Một số Post-Trigger hay dùng
- Post-Change: Thực hiện khi dừ liệu cùa item được thay đối với giá trị chấp nhận không phải là giá trị null.
- Post-form: Xuất hiện trong khi thoát khỏi form
- Post-query: Thực hiện sau khi dữ liệu được điền vào các record
- Post-record: Xuất hiện khi rời input focus từ bàn ghi này tới bản ghi khác.
Key - Trigger:
Các loại trigger này dùng để thay thế các tính năng cùa phím chức nằng thông thường, chăng hạn như trigger Key-Entqry dược kích hoạt khi các phím chức năng dùng đê chuyên
Hệ quản trị cơ sở dữ liệu Oracle
một block dừ liệu vào trạng thái Enter query được ân. chúng được dùng dế thay thế hoặc là phát triển thêm các tính năng thông thường cùa phím đó
.Một sổ trigger hay dùng:
- Key-up: ứng với việc ON-triggernhấn phím Page-up - Key-down: ứng với việc nhấn phím Page-down - Key-enter: ứng với nhấn phím enter
- Key-next-item: ứng với việc nhấn phím tab On - triggers
Các loại trigger này được dùng để khởi động một giao tác, ví dụ như là các phát biểu trong trigger on-insert thay thế phát biểu insert được sử dụng bời block dừ liệu. Các thao tác đặc biệt trong trigger on là các thao tác quản lý dừ liệu chăng hạn như là xóa dừ liệu và điền dừ liệu lại vào một block dừ liệu chi tiết sau khi thay dồi các record trong block dừ liệu cha.
Các On-Triggers hay dùng
On-error: Thực hiện khi có một lồi nào đó xuất hiện On-mesage: Thực hiện khi hiện các message
7. Cấp phát và thu hồi các extents
Việc cấp phát các extent xảy ra mỗi khi segment được tạo mới, được mở rộng hay bị thay đổi (altered). Và nó sẽ bị thu hồi khi segment bị huỷ, bị thay đổi, bị cắt bớt (truncated). Riêng đối với các rollback segments, các extent có thể bị tự động thu hồi.
Tiến trình SMON sẽ chỉ kết hợp các extent trong cùng tablespaces khi mà PCTINCREASE lớn hơn 0. Trong storage clause mặc định của tablespaces, đặt
PCTINCREASE=1 khi đó các user objects có thể được tự động kết hợp các vùng trống mỗi khi nó được giải phóng.
Yêu cầu kết hợp vùng trống
View DBA_FREE_SPACE_COALESCED được dùng để xem tablespace nào có các extents rỗng có thể kết hợp được với nhau. Sử dụng câu lênh truy vấn sau đây để lấy các thông tin:
SVRMGR> SELECT tablespace_name, total_extents, percent_extents_coalesced
FROM dba_free_space_coalesced WHERE percent_extents_coalesced <100>Coalesce Free Extents.
8. Các loại Segments
Segments là các vùng không gian của các objects (đối tượng) trong database. Dưới đây, ta sẽ xem xét một số loại segments cụ thể.
Table
Table partition Cluster
Index
Index-Organized Table Index Partition
Rollback Segment Temporary Segment LOB Segment LOB Index Nested Table Bootstrap Segment 9. Index
Index (tạo chỉ mục): sử dụng Oracle Index nhằm tăng tốc độ xây dựng lại các dòng theo một khóa đặc biệt. Đảo đảm giá trị duy nhất trong cột, đa số là giá trị primary key.
Câu lệnh:
CREATE [UNIQUE] INDEX index_name ON table (column [, <column2>] ,…)
Ví dụ:
CREATE UNIQUE INDEX i_essn ON NHAN_VIEN (ESSN);
Các loại index:
UNIQUE: Bảo đảm giá trị trong các cột là duy nhất.
NONUNIQUE: (là default) kết quả truy vấn có thể nhanh nhất - Nếu là Single colum thì chỉ một cột tồn tại index.
- Nếu là Concatenated Index: Trên 16 cột có thể chỉ ra trong index (giới hạn 30).
Xóa index Câu lệnh:
DROP INDEX index_name;
VD: DROP INDEX i_essn;