Tải bản đầy đủ (.pdf) (380 trang)

GIÁO TRÌNH HD LÝ THUYẾT VÀ KÈM THEO BT THỰC HÀNH ORACLE 11G: TẬP 2

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (18.96 MB, 380 trang )

Th.S NGUYEN QUANG NINH - NGUYEN NAM THUAN
va nhom

tin hoc thuc dung

GIÁO TRÌNH

AS Aa h3
KÈM THEO BÀI TẬP THỰC HÀNH

tr ariEfin
BER NS C2

DÀNH CHO HỌC SINH SINH VIÊN

NHÀ XUẤT BẢN HÔNG ĐỨC


Giáo trình

Hướng dẫn Lý thuyết và

kèm theo bài tập thực hành
ORACLE 11g - 2


Th.S: NGUYỄN

QUẢNG NINH - NGUYEN NAM THUAN
va nhóm Tìn học thực dụng


GiÁn TRÌNH
Hướng dẫn Lý thuyêt

Và kèm theo bài tập thực hành

ORACLE 11s

Danh

cho hoc sinh sinh vién

An ban 2009

NHA XUAT BAN HONG DUC


Lưới NĨI ĐẦU
“Giáo trình Hướng dẫn Lý thuyết và kèm theo bài tập thực

hanh ORACLE 11g” được biên soạn toàn diện từ đầu đến cuối

nhằm mục đích giúp bạn đọc làm quen với ngơn ngữ lập
trình PL/SQL, nắm vững các điểm cơ bản của ngôn ngữ và

các kỹ thuật lập trình nâng cao để có thể phát triển các ứng
dung PL/SQL manh được điều khiển bởi cơ sở đữ liệu, giúp
nhanh chóng hồn thành các dự án phát triển của các cá

nhân, công ty và doanh nghiệp.
Sách gồm 2 tập, được thiết kế thành các phần chính sau

đây:

Phan I: Cac điểm cơ bản uê PL/SQL
Phần này giới thiệu các tính năng Oracle Database

10g

phiên bản 2 gần đây và các tính năng Oracle Database 11g
mới, trình bày các điểm cơ bản cia PL/SQL, va giải thích các
khái niệm về ngữ nghĩa, các kiểu đữ liệu, các cấu trúc điều
khiển và sự quản lý lỗi.
Phân II: Lập trình PLJSQL
Phần này trình bày cách sử dụng các công cụ mạnh để
phát triển các ứng dụng cơ sở dữ liệu phù hợp nhu cầu thực tế
và mang lại hiệu quả ứng dụng cao, bao gồm các hàm và thủ
tục, các tập hợp, các gói, các bộ kích khởi (trigger) và các đối
tượng lớn Oracle.

Phần III: Lép trinh néng cao PL/SQL
Với phần nay, ban đọc sẽ được hướng dẫn vé SQL động, sự
liên kết giữa các phiên làm việc, các thủ tục ngoài, các loại
đối tượng, các thư viện Java và sự phát triển ứng dụng Web
nhằm đạt được các kỹ thuật lập trình nâng cao véi PL/SQL.
Sách được bố cục rõ ràng theo từng chủ điểm cụ thể, nội
dung trình bày ngắn gọn, hy vọng sẽ là một tài liệu tham

khảo thật sự hữu ích cho bạn đọc, đặc biệt là ở lĩnh vực lập
trình cơ sở dữ liệu.

Rất mong đón nhận sự đóng góp ý kiến chân thành từ bạn

đọc về một số sai sót khó tránh khỏi trong q trình biên

soạn nhằm
cảm on.

làm cho sách hoàn thiện hơn. Xin chân thành

Túc gid


Chương 8: Các đối tượng lớn

PHAR OL (62 theo tap 1/
Ldap trinh PL/SQL
Chương 8: Gác đối tượng lớn
Phương 9: Gác gói (Package)
Chương 10: Các Trigger


Chương 8: Các đối tượng lớn

8

CHUONG5
CÁC đối TượNg lớn
C

ác đối tượng lớn (LOB) là những cấu trúc dữ liệu mạnh mẽ cho

phép lưu trữ text, hình ảnh, nhạc và video trong cơ sở dữ liệu.


Oracle 11g thay đối đáng kể bức tranh LOB bằng cách tái

thiết kế cách làm việc của các đối tượng lớn (large obJect). Bây giờ chúng

nhanh hơn và an tồn hơn (SecureFiles). Bạn có thể định nghĩa các cột
BLOB, CLOB hoặc NCLOB

dưới dạng các SecureFiles khi bạn tạo một

table (bảng) hoặc thay đối nó.
Các LOB có thể chứa tối đa 8 đến 128 terabytes, phụ thuộc vào cách
bạn cấu hình cơ sở dữ liệu. Một lệnh gọi đến hàm GET_STORAGE_LIMIT
trong gói (package) DBMS_LOB cho biết kích cỡ LOB tối đa cúa cơ sở dữ
liệu. Bạn có thể lưu trữ các đối tượng lớn ký tự trong các cột CLOB và các
đối tượng lớn nhị phân (binary) bên trong cơ sở dữ liệu dưới dạng các cột
BLOB hoặc bên ngoài cơ sở đữ liệu dưới dạng cột BEILE (binary file).
Các cột BEFILE lưu trữ một locator trỏ sang vị trí vật lý của một file bên
ngồi.

Chương này giải thích cach su dung PL/SQL để làm việc với các kiểu
dữ liệu LOB khác nhau. Chương bao gồm những chủ điểm sau đây:
m

Các đối tượng lớn ký tự
PL/SQL đọc các file và ghi các cột CLOB hoặc NCLOB

Upload
Các đối
PL/SQL

Upload

các CLOB lên cơ sở dữ liệu
tượng lớn nhị phân
doc cac file và ghi các cột BLOB
cac BLOB lên cơ sở dữ liệu

SecureFiles


Chương 8: Các đối tượng lớn

9



Các BFILE ngoài

.



Tao va st dung cac thu muc ao (virtual directories)

m

Goi DBMS_LOB

Những khái niệm chi phối cách sử dụng các kiểu đữ liệu BLOB, CLOB,


và NCLOB thì rất tương tự. Các kiểu dữ liệu CLOB và NCLOB được đề

cập trước tiên vì chúng cho bạn tập trung vào việc quản lý các giao tác
với các khối text lớn. Kiểu dữ liệu BLOB đứng thứ hai bởi vì những khái
niệm thúc đẩy cho các đối tượng lớn ký tự (character). Các BLOB lưu trữ
các tài liệu nhị phân (binary), như các fñle Adobe PDF (Portable Document Format), anh va phim (movie) bên trong cơ sở đữ liệu. Việc truy

cập và hiển thi cdc file BLOB dugc bổ sung bằng cách sử dụng ngơn ngữ
lập trình PHP để kết xuất các ảnh trong các trang web. SecureEiles tuân
theo các kiểu đữ liệu bình thường và được lưu trữ bên trong bởi vì chúng
thêm những tính năng vào các CLOB.

Sau SecureFiles, bạn học cách xác lập, cấu hình, đọc và duy trì các

kiểu đữ liệu BFILE. Chúng đòi hỏi thêm nỗ lực trong một số cách bởi vì

catalog chỉ lưu trữ đữ liệu locator, và bạn phải bảo đảm sự hiện diện vật
lý của chúng trong hệ thống đle. Gói DBMS_LOB đứng sau cùng bởi vi

khơng phải hàm nào cũng cần thiết để hướng đẫn cách sử dụng các đối
tượng lớn. Mỗi phần dựa vào một phần trước nó, nhưng bạn cũng có thể
sử dụng chúng riêng lẻ để tham khảo nhanh.

Các đổi tượng lớn ký tự: Các kiểu dữ liệu CLOB và N€L0B

|]—

——








m—

—— Gm

BHHỊm DƯƠNG HT” VUHHƠNNH

ee

ee

ee i

A-=e= =m-mm

Các kiểu dữ liệu CUOB và NCLOB định nghĩa một cột trong một table
hoặc nested table. Nó có kích cỡ vật lý tối đa giữa 8 và 128 terabytes.
Kiểu đữ liệu CLOB cho péep lưu trữ các file text lớn. File text có thể phục
vụ nhiều mục đích, chẳng hạn như một chương trong sách, một quyển

sách trong thư viện hoặc một đoạn XML. Mục này xem xét text như là
một đơn vị làm việc.

Cột CLOB thường được lưu trữ riêng biệt với phần còn lại của hàng

trong một table. Chỉ deseriptor hoặc locator được lưu trữ vật lý trong cột.

Locator trỏ sang nơi nội dung vật lý của một CLOB được lưu trữ và cung

cấp một tham chiếu dẫn đến vùng làm việc riêng trong SGA. Vùng làm

việc này cho phép cuộn qua nội dung và ghi các cụm đữ liệu mới. Một số

nội dung tham khảo sử dụng thuật ngữ deseriptor để nói đến locator (bộ

định vị BLOB, CLOB và NGLOB, nhưng sử dụng locator khi làm việc
với các BFILE ngoài. Tài liệu Oraele 11g bắt đâu gọi cả hai là các locator

một cách nhất quán.


10

Chương 8: Các đối tượng lớn
Kiểu dữ liệu CLOB

là một loại đối tượng. Là loại đối tượng nên nó đồi

hỏi xây dựng một instance déi tượng một cách ngầm định hoặc tường
minh. Ban có thể xây đựng một biến CUOB ngắm định bằng cách gán
trực tiếp một số hoặc loại ký tự. Khi bạn gán một số vào một kiểu đữ liệu
CLOB, đầu tiên số được cast (gán) vào một kiểu dữ liệu ký tự và sau đó
kiểu dữ liệu ký tự được chuyển đổi thành kiểu dữ liệu CUOB. Thật không
may, các chuyển đổi ký tự cho các kiểu đữ liệu CHAR, NCHAR

NVARCHAR và VARCHAR2 bị ràng buộc bởi môi trường SQL. hoặc PI/
SQL. SQL cho phép chuyển đổi các luồng ký tự lên đến 4.000 bytes,

trong khi PL/SQL cho phép chuyển đổi 32.767 bytes dữ liệu ký tự cùng
một lúc.

Các ví dụ sau đây xem lại cách bạn khai báo một biến CLOB:
var1 GLOB;

-- Declare a null reference to a CLOB.

vari CLOB := empty_clob();

-- Declare an empty CLOB.

var2 CLOB := ‘some_string’:

-- Declare a CLOB with a string literal.

Các cột CLOB khác với các kiểu đữ liệu vô hướng bởi vì chúng khơng
giớt hạn chỉ trong các trạng thái NULL hoặc NOT NULL. Cac BLOB,

CLOB và NCLOB thì NULL, rỗng (empty), hoặc được tập hợp (populated) như được trình bày trong bảng 8.1.
Bạn chèn một CLOB hoặc NCLUOB rẫng bằng cách gọi phương thức
tạo empty_clobQ dưới dạng một biểu thức trong mệnh đề VALUES của
một câu lệnh INSERT. Sự thay đổi duy nhất cho các kiểu dữ liệu BLOB
là việc thay thế phương thức tạo empty_blobQ.
Câu lệnh sau đây chèn một phương thức tạo empty_cÌobQ trong cột
item_desc cua table item:
~ This is found in create_store.sql on the publisher's web site.
INSERT INTO item VALUES
( item_s1.nextval
, — ASIN: B000030XI1'

(SELECT common_lookup_id
FROM

common_lookup

WHERE common_lookup_type = 'DVD_WIDE_SCREEN’)
‘Harry Patter and the Sorcer's Stone’

,
,

‘Two-Disc Special Edition’
empty_clob()

» _ NULL,‘PG','MPAA','28-MAY-2002'
,

3, SYSDATE, 3, SYSDATE);


Chương 8: Các đối tượng lớn

11

Ngay khi đã chèn một CLOB rỗng, bạn có thể cập nhật nó bằng nhiều
cách. Một sự cập nhật cơ bản sử dụng SQL giới hạn bạn chỉ trong chuỗi
4.000 bytes. Sau đây là một câu lệnh SQL mẫu:
UPDATE item
SET


item_desc = 'Harry Poter is seemingly an ordinary eleven-year-old
boy, '

WHERE

item_title = ‘Harry Potter and the Sorcerer’’s Stone’

AND

item_type IN

(SELECT

AND

common_lookup_¡d

FROM

common_lookup

WHERE

common_lookup_table = 'ITEM'

AND

common_lookup_column = 'ITEM_TYPE‘

REGEXP_LIKE(common_lookup_type,'*(DVDIVHS)*'))


Bang 8.1 Các trạng thái dif li€u BLOB, CLOB va NCLOB
Trang thai



tả

NULL

Cột trong một hàng table chứa một giá trị

rong (null).

Empty

Cột chứa một locator (hodc descriptor) LOB

vốn là một instance réng. Ban có thể kiểm
tra một lớp rỗng bằng cách gọi các hàm

DBMS_LOB.GETLENGTH. Hàm trả về
giá trị zero cho một cột BLOB, CLOB hoặc

NCLOB
Populated

rỗng.

Cột chứa một locator LOB và một lệnh

gọi đến hàm DBMS_LOB.GETLERNGTH

trả về một giá trị số nguyên dương cho
một cột BLOB,

CLOB

hoặc NCLOB.

Câu lệnh UPDATTE xác lập cột item _desc bằng với một chuỗi nhỏ hơn
4.000 bytes. Subquery trên table common_]ookup sử đụng mật biểu thức
thơng thường để tìm tất cả cột common_lookup_type bắt đầu với chữ hoa
DVD hoặc VHS.
Nếu bạn chuyển câu lệnh UPDATTE đến bên trong một khối PL/SQL,
bạn có thể gán một chuỗi 32.767 bytes vào cột CLOB. Tuy nhiên, sau đó
bạn phải sử dụng thủ tục WRITEAPPEND từ gói DBMS_LOB để bổ sung
thêm đữ liệu vào cột sau lần ghỉ ban đầu. Phương pháp này có lẽ dễ nhất
và có sẵn rộng rãi nhất trong đoạn mã PL/SQL trên web ghi một cột
CLOB. Giải pháp sử dụng gói DBMS_LOB để đọc một file. Sau đó, nó tải
dữ

liệu

sang

các

cụm

DBMS_LOB.WRITEAPPEND.


32.767

bytes

qua

thử

tục


12

Chương 8: Các đối tượng lớn

Vấn để với phương pháp này là nó khơng tận dụng mệnh đề RETURNING INTO ma bạn có thể thêm vào các câu lệnh DML INSERT
hoặc UPDATTE. Bạn biến đổi các câu lệnh INSERT hoặc UPDATE

các lệnh gọi hàm bằng cách thêm mệnh để này.
Mệnh đề RETURNING

thành

khai báo một tham số chế độ OUT hình thức

đưới dạng đích của vị ngữ INTO. Mệnh đề neo (anchor) một bộ mô tả
(descriptor) cột sang biến chế độ OUT. Tham số thật sự phải là một biến
CLOB hoặc NCLOB được khai báo. Thực tế nó mở nguồn tài nguyên
luồng (stream resource) vào cột đối tượng lớn nhằm cho bạn tránh những

gidi han kich cd cha SQL va PL/SQL. Hinh 8.1 minh hoa tién trình về
cách làm việc cha ménh dé RETURNING

INTO.

Bạn có khả năng ghi sang cột CLOB hoặc NCLOB từ đầu một lệnh
TINSERT hoặc UPDATE (vốn mở nguần) cho đến cuối phạm vỉ giao tác.
Một câu lệnh COMMTT hoặc ROLLBACK kết thúc phạm vi giao tác bên
trong khối SQL hoặc PL/SQL và đóng luồng đối tượng lớn. Một sắc thái
khác là sự kết thúc của khối độc lập vốn cũng có thể commit việc ghi.

Mệnh

để

RETURNING

nhận

dạng

tham số hình thức bằng cách nao nó
Đầu vào tham
chiếu

sang một tên cột. Nó cũng xác lập chế
độ hoạt động sang chế đè IN va OUT

(hoặc chuyển theo tham chiếu).


Độ định vị khứ hồi (Retum Locator)

Đầu ra tham
chiếu

Cơ sở
dữ liệu

Mệnh để INTO gán một biến cục

bộ dưới dạng tham số thật sự của

một lệnh gọi hàm để tạo một nối

kết cơ sở dữ liệu. Nối kết cho bạn
ghi dữ liệu sang mat locator BLOB
hoac CLOB trong mét giao tac.

Hình 8.1 Cấu trúc hàm dinh vi LOB ngdm dinh


Chương 8: Các đối tượng lớn

13

Nguyên mẫu câu lệnh INSERT và UPDATE sau đây minh họa một
phương pháp đặc biệt để quản lý các kiểu dữ liệu LOB. Từ khóa RE-

TURNING cia ménh dé RETURNING INTO lic dau vung vé nhưng nó
có nghĩa là phân kênh tham chiếu cột vào một biến cục bộ.

Câu lệnh INSERT
Câu lệnh INSERT khởi tạo một cột CLOB và sau đó nó trả về locator

qua câu lệnh RWTURNING INTO vào một biến cục bộ. Biến cúc bộ được
chuyển theo tham chiếu và có chế độ hoạt động OỤT. Bạn có thể xem
chương 6 để biết chỉ tiết về hoạt động chế độ OUT, nhưng đặc biệt nó
khơng cho phép gởi một giá trị đến một tham số hình thức trong một
chữ ký hàm. Trong câu lệnh INSERIT, việc gán bên trong mệnh đề các
giá trị có vai trị như là một phần của hoạt động chế độ IN. Việc chèn
cũng bắt đầu một phạm ví giao tác. Bạn có thể thêm vào hoặc thay thế
nội dung duge tré vao locator trong phạm vì của giao tác này.
Thừa kế kiểu dữ
liệu của cột được.

tham chiếu.

INSERT wire

table nts

bmn_name2[,column_namée(n+1)}})

Xác lập giá trị
cột ban đầu.

)

Xác lập tên

biến cục bộ.


Câu lệnh UPDATE
Câu lệnh UPDATE xác lập giá trị cột CLOB bang ham EMPTY_CLOB

và sau đó nó trả về column locator (bộ định vị cột) qua mệnh để RETURNING INTO vào một biến cục bộ. Biến cục bộ được chuyển theo

tham chiếu và có một chế độ hoạt động OUT. Như câu lệnh INSERIT, sự

cập nhật cũng bắt đầu phạm vỉ giao tác. Bạn có thể thêm vào hoặc thay
thế nội dung được trỏ vào bởi locator trong phạm vi của giao tác.


14

Chương 8: Các đối tượng lớn

UPDATE

table_name

SET

c

namel

Xác lập giá trị

catia: đầu.


=

co1u

Thừa kế kiểu dữ

liệu của cột được
tham chiếu.

value1

Xác lập tên

biến cục bộ.

Cuối cùng, đọc và ghi trong các cụm cần thiết cho các file có kích cỡ

hàng trăm megabytes, gigabytes, hoặc terabytes nhưng khơng phải cho
các fđile nhỏ hơn 100 megabytes. Một số nhà phát triển chuyển sang C,
C++, C#, Java hoặc PHP để hoàn tất việc đọc và ghi các ñle CLOB nhỏ.
PL/SQL hỗ trợ việc ghi những file này mà khơng phụ thuộc vào các file

bên ngồi. Mục nhỏ đầu tiên hướng dẫn bạn đọc các file ngoài và ghỉ

chúng dưới dạng các cột CLOB. Giải pháp trong mục này sử dụng riêng

PL/SQL. Mục nhỏ tiếp theo trình bày một ví dụ PHP hướng dẫn cách

upload một file, ghi trực tiếp luồng đữ liệu sang một cột CLOB và sau đó
đọc nội dung cột vào một trang web.


Các phần phụ sau đây thảo luận những phương pháp đọc và ghi các
cột CLOB hoặc NCLOB sang các cột cơ sở dữ liệu. Mục thứ nhất thảo
luận một giải pháp server cơ sở đữ liệu và mục thứ hai cung cấp bạn một

thi tuc PL/SQL để hỗ trợ việc upload CLOB hoặc NCLOB từ xa.
PL/SQL ñụt cát File và ghi các cột CLOB hodc NCLOB

Gói DBMS_LOB cung cấp tất cả cơng cụ cần thiết để tải trực tiếp các

đối tượng lớn khi chúng vượt quá những giới hạn luồng byte của SQL
hoặc PL/SQL. Bước đầu tiên đòi hỏi bạn định nghĩa một thư mục ảo
(virtual đirector). Điều này được thực hiện cho bạn khi ban chay script
create_user.sql từ web site của nhà xuất bản. Thư mục ảo là một bí danh

thư mục nội tại trồ vào một đường dẫn.

Trong ví dụ này, bạn tạo một thư mục ảo trỏ vào thư mục cục bộ tạm

thời của bạn. Bạn phải kết nối dưới dạng người dùng SYSTEM để định

nghĩa các thư mục ảo. Các lệnh sau đây làm việc trên hệ điều hành cụ

thể của bạn:

Linux hoặc Unix
CREATE

DIRECTORY generic AS '/tmp';



Chương 8: Các đối tượng lớn

15

Windows
CREATE

DIRECTORY generic AS 'C:\Windows\temp';

Sau khi bạn thư mục ảo, bạn cần cấp phát các quyền đọc trên thư mục

cho người dùng plsql. Cú pháp là

GRANT READ ON DIRECTORY generic TO plsql;

Các bước tiếp theo là đọc ñle và ghi dữ liệu sang cột CLOB. Trong khi
vài đoạn mã nhỏ có thể trình bày những khái niệm, một ví dụ mã hoạt
động được cho. Bằng cách này, bạn có thể cắt và đán nó ngay vào các
ting dung cia ban. Vi du st dung NDS (Native Dynamic SQL). Ban nén

tham khảo chương 11 nếu bạn tò mị về những cơ cấu của ND8.

Thủ tục load_clob_ftom_đle sau đây minh họa cách làm điều này:
-= Thịs is found ìn load_eloh_from _file.sql an the publisher's web site.

CREATE OR REPLACE PROCEDURE load_clob_from_file
( src_file_name

IN VARCHAR2


, table_ name

IN VARCHAR2

, Column_name

IN VARCHAR2

, primary_key_name

INÑ VARCHAR2

, primary_key_value

IN VARCHARZ ) |S

-- Define local variables for DBMS_LOB.LOADCLOBFROMFILE

procedure.

des_clob CLOB;
src_clob BFILE := BFILENAME('GENERIC' sre_file_name);
des_offset NUMBER

:= 1;

src_offset NUMBER

:= 1;


ctx_lang NUMBER

:= dbms_lob.default_lang_ctx;

warning NUMBER;

-- Define a pre-reading size.
src_clob_size NUMBER:
-- Define local variable for Native Dynamic SQL.

stmt VARCHAR2(2000);
BEGIN
-- Opening source file is a mandatory operation.

IF dbms_lob.fileexists(src_ctob) = 1 AND NOT dbms_lob.isopen
(sr¢_clob) = 1 THEN
src_clab_size := dbms_lob.getlength(src_clob);

dbms_ltob.open(sre_clob, DBMS_LOB.LOB_READONLY);


16

Chương 8: Các đối tượng lớn
END IF;
-- Assign dynamic string to statement.
stmt := ‘UPDATE ‘I | table_name
||


|’ '

‘SET ‘I | colurn_name } | ‘ = empty_clob() ‘

1) ‘WHERE 'I | primary_key_name ||‘ = 1Í ”" | 1 primary_key_vaiuel |" *
} | ‘RETURNING ‘11 column_name | 1 * INTO :tocator’;
-- Run dynamic statement.

EXECUTE IMMEDIATE stmt USING OUT des_clob;
-- Read and write file to CLOB, close source file and commit.
dbms_lob.loadclobfromfile( dest_lob => des_clob
, src_bfile => src_clob
, amount => dbms_lob.getlength(src_clob)
, dest_offset => des_offset
, Sr€_0ffset => src_ 0ffset
, bfile_csid => dbms_lob.default_csid
, lang_context => ctx_lang
, warning => warning );

dbms_lob.close(src_clob):
IF src_clob_size = dbms_lob.getlength(des_clob) THEN

$IF $$DEBUG = 1 $THEN
dbms_output.put_line(‘Success!');

$END
COMMIT;
ELSE
SIF $$DEBUG = 1 $THEN
dbms_output.put_tine('Failure.’);


$END
RAISE dbms_lob.operation_failed;
END IF;
END

load_clob_from_fite;

/

Thủ tục đòi hỏi các đối số để sử dụng nó trên bất kỳ table nào có một

cột CLOB và một khóa chính của cột. Lệnh gọi thủ tục DBMS_LOB.OPEN

mở le ngoài và đọc nó vào một kiểu dữ liệu BELIE. Hàm BFILENAMRE
bảo vệ đường dẫn thư mục chuẩn tắc từ catalog cơ sở dữ liệu và thêm tên
file. Hàm BEILENAME trả về một tên fñle chuẩn tắc. Câu lệnh UP-


Chương 8: Các dối tượng lớn

17

DATE động xác lập cột CLOB sang một empty_clob(). Sau đó, câu lệnh

UPDATE

trả về cột được ấn định vào một biến đầu ra. Biến liên kết

locator 1a bién dau ra trong cau lénh NDS. Ban gán locator CLOB sang

biến des_clob khi câu lệnh NDS chạy.
Câu lệnh UPDATE

sứ dụng RETURNING

cột đích cho tất cả hàng cập nhật.

INTO

sẽ thay đổi giá trị

Tất cả hành động trước đọc le nguồn và liên kết với một bộ định vị
cột CLOB vào phạm vi chương trình. Với hai phương thức xử lý nguồn
tài nguyên này, lệnh gọi đến
nội dung của ñle mở sang bộ
không bị giới hạn xử lý 32.767
pháp để đọc trực tiếp các cụm

thú tục LOADCLOBFROMFILE
định vị CUOB. Hoạt động đọc và
byte của PL/SQL,. Nó cũng là một
đle lớn vào các cột CLOB. Các giá

chuyển
ghi này
phương
trị dịch

chuyển ñle nguồn (src_offset) và các giá trị dịch chuyển cột CLOB đích
(dest_offset) cho bạn phân tích cú pháp các cụm từ file và đặt chúng


trong cột CLOB. Tất cả những gì bạn cần làm là thêm logic cho một
vịng lặp, vì các đle mẫu tương đối nhơ nhưng lớn hơn 4.000 bytes (vốn
giới hạn một phép gán trực tiếp bên trong một câu lệnh UPDATTE).
Bạn có thể test thủ tục lưu trữ này bằng cách chạy chương trình khối
nặc danh sau đây:

-- This is found in load_clob_trom_file.sql on the publisher's web site.

BEGIN
FOR i IN (SELECT item_id
FROM item
WHERE item_title = ‘The Lord of the Rings - Fellowship of the Ring’
AND item_type IN
(SELECT

common_lookup_id

FROM

common_lookup

WHERE

common_lookup_table = ‘ITEM’

AND

common_lookup_column


= 'ITEM_TYPE'

AND REGEXP_LIKE(common_lookup_type,’“(dvdlvhs)*','i')))

LOOP
-- Call reading and writing CLOB procedure.
load_clob_from_fite( src_file_name => 'LOTRFellowship.txt'
, table_name => ‘ITEM’
; 00Ìlumn_ name => 'ITEM_DESG'
, Drimary key_name

=> 'TEM_!D'

, primary_key_value => TO_CHAR(i.item_id));

END LOOP;


Chương 8: Các đối tượng lớn

18
END;
/

Lệnh gọi đến thủ tục load_clob_from_le được thực hiện cho mọi giá
trị item_id đáp ứng quy tắc nghiệp vụ được xác định bởi phép tim kiếm
biểu thức thông thường. Biểu thức thông thường nhận được tất cả hàng
DVD va VHS noi item _title là “The Lord of the Rings- Fellowship of the

Ring” và item_type ánh xạ sang một giá trị chuẩn bắt đầu với một chuỗi

con DVD hoac VHS.

Bạn có thể chạy định dạng và query sau đây để xác nhận rằng ba

hang bây giờ có các cột CLOB với các luồng dữ liệu dài hơn 4.000 bytes.
-- Format column for output.

COL item_id FORMAT 9999
COL item_title FORMAT A50
COL size FORMAT 9,999,990
-- Query column size.
SELECT _

item_id

;

item_title
dbms_lob.getlength(item_desc) AS “SIZE”

FROM

item

WHERE dbms_iob.getlength(item_desc) > 0;
It yields the following three rows:

ITEM_ID ITEM_TITLE SIZE
1037 The Lord of the Rings - Fellowship of the Ring 5,072
1038 The Lord of the Rings - Fellowship of the Ring 5,072

1039 The Lord of the Rings - Fellowship of the Ring 5,072

Upload cdc CLOS lén cd 30 da lidu
Nhu PL/SQL, cdc ngén ngi lập trình bên ngồi làm việc với những

giới hạn giống y như để upload và ghi các cột CLOB hoặc NCLOB. Bạn

phải chọn nhập các cụm nhỏ 32.767 bytes) hay các cụm lớn 1MB trở lên.
Mục này giả định bạn muốn upload và ghi các cụm lớn thơng qua các

chương trình bên ngồi.
Giải pháp sau đây tạo một thủ tục PL/SQL có khả năng hỗ trợ bất. kỳ

ngơn ngữ lập trình web bên ngồi làm việc với các thư vién Oracle JDBC
hoặc OCI8. Nó cho phép xác lập lại và thêm một giá trị cột CLOB hoàn
chỉnh, nhưng bạn nên nhớ các file quá lớn sẽ được ghi dưới dạng các
cụm.


Chương 8: Các đối tượng lớn

19

-- This is found in create_web_clob_loading.sql on the publisher's web site.

CREATE OR REPLACE PROCEDURE web_load_clob_from_file
( item_id_in 1N NUMBER
, descriptor IN OUT CLOB ) IS

BEGIN

-- A FOR UPDATE makes this a DML transaction.
UPDATE

item

SET

item_desc = empty_clob{)

WHERE

item_id

RETURNING

item_desc INTO descriptor;

= item_id_in

END web_load_clob_from_file;
/

Thủ tục này cho bạn mở một bộ định vị CLOB và truy cập nó từ file

chương trình từ xa. Có ba tính năng chính trong thủ tục này. Thứ nhất,

tham số hình thức là một bộ định vị CLOB với một sự truy cập chế độ TN

OUT. Thứ hai, mệnh đề RETURNING TNTO cung cấp một cổng nối biến
cục bộ vào biến mệnh đề SET. Thứ ba, việc thiếu một COMMITT trong

thủ tục lưu trữ làm cho lớp bị khóa và phạm vi giao tác DML
chương trình web bên ngồi.

mớ cho

Những mục trên đã trình bày cách đọc và ghi các cột CLOB và NCLOB

trên tầng cơ sở dữ liệu và thơng qua các chương trình bên ngoài.

Các đổi tượng lớn nhị phân: Kiểu dữ liệu BLOB
Kiểu đữ liệu BLOB có thể định nghĩa một cột trong một table hoặc
nested table. Như kiểu đữ liệu CLOB, nó có kích cỡ vật lý tối đa giữa 8 và
128 tegabytes. Kiểu dữ liệu BLOB cho phép lưu trữ các ñle nhị phân lớn

nhu cac anh, track nhac, phim (movie) hodc cac file Portable Document
Format (PDF). Muc nay xem xét cách ban có thể upload, ghi và đọc các
kiểu dữ liệu BLOB,

Gh hic
Như kiểu du liẹu CLOB, kiểu dỡ liẹua BLOB có kích cỡ cội lối đa được xác lập
bại lham số khải lạo cơ số da liệu db_ Hock_ size. Kch cỡ khái SKÐ

mạc định

giới han mot BLOB chi long 8 lerabules.

Các cột BLOB thường được lưu trữ riêng biệt với phần còn lại của

hàng trong một table. Chỉ deseriptor hoặc locator được lưu trữ vật lý
trong cột, Locator trỏ vào nơi nội dung vật lý của một BLOB được lưu trữ

và cung cấp một tham chiếu dẫn sang vùng làm việc riêng trong SGA.
Vùng làm việc này cho phép đọc và ghi các cụm đữ liệu mới. Một số gọi


20

Chương 8: Các đối tượng lớn

handle BLOB la descriptor (bộ mô tả) và giữ lại biệt hiệu locator cho
thời điểm chúng làm việc với các BEFILE ngoài. Một trong hai làm việc,

nhưng tài liệu Oracle 11g bắt đầu gọi cả hai là các locator một cách nhất
quán. Sách này tuân theo quy ước đó và gọi chúng là các locator.

Như kiểu đữ liệu CLOB, kiểu đữ liệu BLOB là một loại đối tượng. Nó

địi hỏi việc xây đựng ngầm định hoặc tường minh. Bạn có thể xây dựng

biến BLOB một cách ngầm định bằng cách gán một giá trị rỗng, một
phương thức tạo empty_blobQ hoặc một chuỗi thập lục phân. Chương 3
dé cập việc khởi tạo và gán các giá trị vào các kiểu dữ liệu BLOB.

Các ví dụ sau đây xem lại cách bạn khai báo một biến BLOC:
var1 BLOB;

-- Declare a null reference to a BLOB.

var} BLOB := empty_blob{);

-- Declare an empty BLOB.


var2 BLOB := '43'} | '41'1 1 '52';

-- Declare a hexadecimal BLOB for CAR.

Có hai cách để tập hợp lại các cột BLOB. Ban có thể tải một file phía
server bằng cách gọi các thủ tục OPEN, LOADBLOBFROMFILE và
CLOSE được tìm thấy trong gói DBMS_LOB. Bạn có thể sử dụng một

ngơn ngữ lập trình bên ngồi như Java hoặc PHP. Java sử dụng các thư

viện JDBC để ghi một luồng nhị phân (binary stream) sang một cột
BLOB, và PHP sử dụng các thư viện OCI8 để ghi một luồng nhị phân.
Các cột BLOB khác với các kiểu dữ liệu vơ hướng vì cùng một lý do

rằng các cột CLOB khác nhau. Chúng cũng không bi giới hạn chỉ trong
cdc trang thai NULL ho&ac NOT NULL. Cac BLOB, CLOB va NCLOB 1a
NULL, empty, hodc populated nhu dugc trinh bay truéc d6 trong bang
8.1.

Như trong trường hợp của các cột CLOB, có một vấn đề với phương

pháp này. Nó khơng tận dụng mệnh đề RETURNING

INTO mà bạn có

thể thêm vào bất kỳ câu lệnh DML INSERT hoặc UPDATE. Bạn biến
đối các câu lệnh INSERT hoặc IPDATE

cách bổ sung mệnh đề này.

Mệnh dé RETURNING

thành các lệnh gọi hàm bằng

khai bdo mét tham số chế độ OUT hình thức

dưới dạng đích của vị ngữ INTO. Ménh dé neo (anchor) mét b6 mé tả cột

(column descriptor) sang biến chế độ OUT. Tham số thật sự phải là một
biến BLOB được khai báo. Thực tế nó mở một nguồn tài nguyên luồng
vào cột đối tượng lớn giúp tránh những giới hạn kích cỡ của SQL và PL/
SQL. Hinh 8.1 trước đó trong chương này minh họa tiến (trình về cách

làm việc của mệnh đề RETURNING INTO.
Bạn có thể ghi sang cột BLOB từ đầu một câu lệnh INSERT hoặc
UPDATE (vốn mở luỗng) cho đến cuối phạm vi giao tác. Một câu lệnh
COMMIT

hoặc ROLLBACK

kết thúc phạm vi giao tác bên trong một

khối SQL hoặc PL/SQL và đóng luồng đối tượng lớn. Một sắc thái khác
là sự kết thúc của một khối độc lập mà cũng phải commit việc ghi.


Chương 8: Các đối tượng lớn

21


Các nguyên mẫu câu lệnh INSERT và UPDATE sau đây minh họa
một phương pháp đặc biệt để quản lý các kiểu dữ liệu LOB. Chúng là các

ảnh gương với những ảnh làm việc với các kiểu dữ liệu CLOB và NCLOB
nhưng đối với phương thức tạo empty_blỏb(). Từ khóa RETURNING của
ménh dé RETURNING INTO nghia là phân kênh tham chiếu cột vào
một biến cục bộ.

Câu lệnh INSERT
Câu lệnh INSERT khởi tạo một cột BLOB, và sau đó nó trả về locator

thơng qua mệnh đề RETURNING INTO vào một biến cục bộ. Biến cục

bộ được chuyển theo tham chiếu và nó có chế độ hoạt động OUT. Ban cé

thể xem chương 6 để biết chỉ tiết về hoạt động chế độ OUT, nhưng đặc

biệt nó khơng cho phép gởi một giá trị đến một tham số hình thức trong
một chữ ký hàm. Trong câu lệnh INSERT, việc gán bên trong mệnh dé

các giá trị có chức năng như là một phần của hoạt động chế độ IN. Việc
chèn (insert) cũng bắt đầu một phạm vi giao tác. Bạn có thể thêm vào

hoặc thay thế nội dung được trỏ vào bởi locator trong phạm vi của giao
tác này.
Thừa kế kiểu dữ
liệu của cột được

tham chiếu.


INSERTJINTO

table_name

(column _namel{ ¡co1lmn_name2[, column name

emp

X Binh Ú ti 294

(n+1)]]

)

›_value2[,coIumn value (nt1)}]

Xác lập giá trị
cột ban đầu.

)

Xác lập tên

biến cục bộ.

Câu lệnh UPDATE
Cau
Nó xác
mệnh
chuyển


lénh UPDATE giả định column_name2
lập giá trị của cột BLOB và sau đó nó
đề RETURNING INTO đến một biến
theo tham chiếu và nó có một chế độ

là mot! kiểu dữ ligu BLOB.
trả về locator thông qua
cục bộ. Biến cục bộ được
hoạt động OUT. Như câu

lệnh INSERT, cau lénh UPDATE bắt đầu một phạm vi giao tác. Bạn có

thể thêm vào hoặc thay thế nội dung được trổ vào bởi locator trong
phạm vi của giao tác này.


22

Chương 8: Các đối tượng lớn
Xác lập giá trị
cột ban đầu.

UPDATE

table name

SET

column_namel


Lz

column_name (n+1)

= columt

RETURNING

valuel

column_value(nt1)]]

nto 1i

"Thừa kế kiểu dữ
liệu của cột được

tham chiếu.

e

)

Xác lập tên

biến cục bộ.

Hai mục tiếp theo minh họa cách đọc các file lớn hơn giới hạn PL/
S§QL cho dữ liệu ký tự và ghi chúng sang các cột BLOB. Mục thứ nhất,

mỉnh họa cách ghi module PL/SQL để tải một BLOB. Thật không may,
bạn không thể đọc từ một BLOB từ cơ sở đữ liệu vào SQL*Plus dưới dạng

bất cứ thứ gì ngoại trừ chuỗi nhị phân. Các ví dụ đọc và hiển thị sử dụng

PHP để minh họa cách nó được upload, được ghi sang cơ sở dữ liệu và

được kết xuất trong một trang web như thế nào.
PL/SQL figc cac File va ghi cac cot BLOB

Gói DBMS_LOB cung cấp tất cả cơng cụ cần thiết để tải trực tiếp các
đối tượng lớn khi chúng vượt quá những giới hạn bộ đệm (buffer) của

SQL hoặc P1/SQL. Bước đầu tiên đòi hỏi bạn định nghĩa một thư mục ảo
(virtual directory). Tuy nhiên, như được để cập trong mục “PL/SQL doc

các File và ghi các cột CLOB hoặc NCLOB”, thư mục cơ sở dữ liệu ảo này
phải trỏ vào một đường dẫn chuẩn tắc. Như trong ví dụ CLOB, bạn cần
tạo một thư mục ảo ánh xạ sang thư mục hệ điều hành tạm thời.

Bạn phải kết nối dưới dạng người dùng SYSTEM để định nghĩa các
thư mục ảo. Nếu bạn đã tạo thư mục ảo này trong phần vừa rồi, bạn có
thể bỏ qua việc tái định nghĩa chúng ở đây. Các lệnh sau đây làm việc

phụ thuộc vào hệ điều hành cụ thể:
Linux hoặc Unix
CREATE

DIRECTORY generic AS '/tmp':


Windows
CREATE DIRECTOR generic AS 'C:\Windows\temp’;



×