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 co 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
Trang 1va nhém tin hoc thuc dung
Trang 2Hướng dẫn Lý thuyết và kèm theo bài tập thực hành
ORACLE 11g - «2
Trang 3Th.S: NGUYEN QUANG NINH - NGUYEN NAM THUAN
Trang 4Lo NOI DAU
"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" đượ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
dụng PL/SQL mạnh được điều khiển bởi cơ sở đữ liệu, giúp
nhanh chóng hoà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:
Phân 1: Các đ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 của PL/SQL, và 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 PLISQL
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 đụng cơ sở dữ liệu phù hợp nhu edu thực tế
va 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 TỊL: Lập trình nâng cao PL/SQL
Với phần này, bạn đọ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ở đữ 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 quá trình biên soạn nhằm làm cho sách hoàn thiện hơn Xin chân thành
cảm ơn
Tác giả
Trang 5PHAN I [tip theo tap 1)
Lập trinh PL/SQL
Chương 8: Các đối tượng lớn
Phương 9: Gác gói (Package}
Chương 10: Các Trigger
Trang 6CHƯỢNG 5
CÁC đối rượng lớn
phép lưu trữ text, hình ảnh, nhạc và video trong cơ sở đữ 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 toà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 SecureEiles 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 goi dén ham 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 co 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 BFILE (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 ngoài
Chương này giải thích cách sử dụng PI⁄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 dec cac file va ghi các cột CLOB hoặc NCLOB
Upload các CLOB lên cơ sở dữ liệu
Các đối tượng lớn nhị phân
PL/SQL đọc các file và ghi các cột BLOB
Upload các BLOB lên cơ sở dữ liệu
SecureFiles
C ác đối tượng lớn (LOB) là những cấu trúc đữ liệu mạnh mẽ cho
Trang 78 Các BFILE ngoài
Tạo và sử dụng các thư mục ảo (virtual đirectories)
R Gói DBMS_LOB
Những khái niệm chỉ phối cách sử dụng các kiểu dữ liệu BLOB, CLOB,
và NCLOB thì rất tương tự Các kiểu đữ liệu CLOB và NOLOB đượ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 ñle Adobe PDF (Portable Docu- ment Format), anh va phim (movie) bén trong co sé dif ligu Viée truy
cập và hién thi cdc file BLOB được 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 SecureFiles 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à đuy trì các kiểu đữ liệu BEFILE 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 điện vật
lý của chúng trong hệ thống file Gói DBMS_LOB đứng sau cùng bởi vì
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 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 dữ 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ỉ descriptor hodc 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à ghỉ 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à NCLOB, nhưng sử dụng locator khi làm việc
với các BEFILE ngoài Tài liệu Oracle 11g bắt đầu gọi cả hai 1A cdc locator một cách nhất quán.
Trang 8Kiể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 đối tượng một cách ngầm định hoặc tường
minh Bạn có thể xây dựng một biến CLOB 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 dữ liệu CLOB, đầu tiên số được cast (gán) vào một kiểu đữ liệu ký tự và sau đó
kiểu dữ liệu ký tự được chuyển đổi thành kiểu dữ liệu CLOB Thật không
may, các chuyển đổi ký tự cho các kiểu dữ liệu CHAR, NCHAR
NVARCHAR và VARCHAR2 bị ràng buộc bởi môi trường SQL hoae PL/
SQL 8QL 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 33.767 bytes đữ 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:
var† GL0B; Declare a null reference to a GLOB vart 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ới hạn chỉ trong các trạng thái NULL hoặc NOT NULL Các BLOB, CLOB va NCLOB thi NULL, rỗng (empty), hoặc được tập hợp (popu-
lated) như được trình bày trong bảng 8.1
Bạn chèn một CLOB hoặc NCLOB rỗng bằng cách gọi phương thức
tạo empty_clob() 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 đữ liệu BLOB
là việc thay thế phương thức tao empty_blob()
Câu lệnh sau đây chèn một phương thức tạo empty_elobQ trong cột
item_desc của table item:
+ This is found in create_store.sqi on the publisher's web site
INSERT INTO item VALUES
{ item_s1.nextval
, — §IN: B000030XI1'
(SELECT common_lookup_id
FROM common_lookup
WHERE common_lookup_type = 'DVD_WIDE_SCREEN')
‘Harry Potter and the Sorcer''s Stone’
» ‘Two-Disc Special Edition’
» empty_clob()
» NULL,'PG',"MPAA','28-MAY-2002"
» 3, SYSDATE, 3, SYSDATE);
Trang 9Ngay 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_đese = 'Harry Potter is seemingly an ordinary eleven-year-old
boy, ` WHERE item_title = ‘Harry Potter and the Sorcerer’’s Stone’
AND _ item_type IN
(SELECT common_lookup_id
FROM common_lookup
WHERE common_lookup_table = ‘ITEM’
AND common_lookup_column = 'ITEM_TYPE'
Populated Cột chứa một locator LOB và một lệnh
gọi dén ham DBMS_LOB.GETLENGTH
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 UPDATE 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_lookup st đụ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 UPDATE đến bên trong một khối PL/SQL, bạn có thể gán một chuỗi 82.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ẽ đễ nhất
và có sẵn rộng rãi nhất trong đoạn mã PI⁄SQL trên web ghỉ 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 32.767 bytes qua thử tục
DBMS_LOB.WRITEAPPEND.
Trang 10Vấn đề với phương pháp này là nó không tận dụng mệnh để RE-
TURNING INTO mà bạn có thể thêm vào các câu lệnh DML INSERT
hoặc UPDATE Bạn biến đổi các câu lệnh INSERT hoặc UPDATE thành các lệnh gọi hàm bằng cách thêm mệnh để này
Mệnh đề RETURNING khai báo một tham số chế độ QUT 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 NGUOB đượ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
giới hạn kích cỡ của SQL và PL/8QL Hình 8.1 minh họa tiến trình về cách làm việc của mệnh để RETURNING INTO
Bạn có khả năng ghi sang cột CLOB hoặc NCLOB từ đâu một lệnh TNSERT 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 P1⁄8QL 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 neo nó sang một tên cột Nó cũng xác lập chế
độ hoạt động sang chế độ IN và OUT Đầu vào tham (hoặc chuyển theo tham chiếu)
Bộ định vị khứ hồi (fAaturn Locator} dữ liệu
Đầu ra tham chiế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 mét locator BLOB hoặc CLOB trong mét giao tac
Hình 8.1 Cấu trúc hàm định vị LOB ngẩm định
Trang 11Nguyê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 của mệnh đề RETURNING INTO lúc đầu vụng 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 cau lénh RETURNING INTO vao 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 OUT 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 INSERT, 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 được trỏ vào 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
INSERT vào table_name
name i[ ,coltmn name2[,column_name(n+1)}) )
uel 070 Local vaTdabie; +
Xác lập giá trị cột ban đầu Xác lập tên
Câu lệnh UPDATE xác lập giá trị cột CLOB bing ham EMPTY_CLOB
và sau đó nó trả về column locator (bộ định vị cột) qua mệnh để RE- TURNING 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 INSERT, su
cập nhật cũng bắt đầu phạm vi giao tác Ban eó 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.
Trang 12liệu của cột được Xác lập tên
tham chiếu biến cục bộ
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 dữ 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
thủ tục PL/SQL để hỗ trợ việc upload CLOB hoặc NCLOB từ xa
PL/SQL doc cdc File va ghi cdc cot 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 bạn chạy script create_user.sqÌ 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';
Trang 13Windows
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 1a doc file va ghi di 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
ứng dụng của bạn Ví dụ sử dụng NDS (Native Dynamie SQL) Bạn nên
tham khảo chương 11 nếu bạn tò mò về những cơ cấu của NDS
Thủ tục load_clob_from_file sau đây minh họa cách làm điều này:
++ This is found in load_clob_from_file.sql on the publisher's web site
CREATE OR REPLACE PROCEDURE load_clob_from_file
Opening source file is a mandatory operation
IF dbms_lob fileexists(src_clob) = 1 AND NOT dbms_lob.isopen ({sre_clob) = 1 THEN
src_clob_size := dbms_lob.getlength(src_clob);
dbms_lob.open(sre_clob, DBMS_LOB.LOB_READONLY);
Trang 14
END IF;
Assign dynamic string to statement
stmt := ‘UPDATE '† I table_name I I ' '
I “SET '11 column_name ¡ | ' = empty_clob() ‘
II WHERE ‘II primary_key_name | | ' = '1[ "" | | primary_key_valtel | "" *
1 ‘RETURNING ‘I | column_name | |‘ INTO :tocator’;
+- Run dynamic statement
EXECUTE IMMEDIATE stmt USING OUT des_slob;
Read and write file to CLOB, close source file and commit
dbms_lob.loadclobfromfile( dest_lab => des_clob
„ Src_bfile => src_clob , amount => dbms_lob.getlength(src_clob) , dest_offset => des_offset
, Src_0ffset => src_offset , bfile_csid => dbms_lob.default_csid
, lang_context => ct†x_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!"};
SEND COMMIT;
Thủ tục đòi hỏi các đối số để sử dụng nó trên bất ky table nao 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ở file ngoài và đọc nó vào một kiểu di liệu BELIE Hàm BFILENAME
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 Ham BFILENAME trả về một tên file chuẩn tắc Câu lệnh UP-
Trang 15DATE động xác lập cột CLOB sang một empty_clobQ 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 là biến đầu ra trong câu lénh NDS Ban gan locator CLOB sang biến đes_clob khi câu lệnh NDS chạy
Câu lệnh UPDATE sử dụng RETURNING INTO sẽ thay đổi giá trị cột đích cho tất cả hàng cập nhật
Tất cả hành động trước đọc file nguồn và liên kết với một bộ định vị cột CLOB vào phạm vỉ 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 thú tục LOADCLOBFROMFILE chuyển
nội dung của ñle mở sang bộ định vị CLOB Hoạt động đọc và ghi này không bị giới hạn xử lý 32.767 byte của PI/SQL Nó cũng là một phương pháp | để đọc trực tiếp các cụm file lớn vào các cột CUOB Các giá trị dịch chuyén file nguén (src_offset) và các giá trị địch chuyển cột CLOB dich (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 fñ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 UPDATE)
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_from_file.sql on the publisher's web site
AND common_lookup_column = 'ITEM_TYPE’
AND REGEXP_LIKE(common_lookup_type,"4(dvdlvhs)*",'i')))
LOOP
Call reading and writing CLOB procedure
load_clob_from_fite( src_file_name => 'LOTRFellowship.txt’
Trang 16END;
/
Lệnh gọi đến thủ tục load_clob_from_file đượ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 tìm 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 - Eellowship of the
Ring” va 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 dang va query sau day để xác nhận rằng ba
hàng bây giờ có các cột CLOB với các luồng dữ liệu đà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
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 CLOB lén ca 30 di liệt
Như PL/SQL, các ngôn ngữ lập trình bên ngoà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 1ME 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 ngoà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 ngoài làm việc với các thu 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
Trang 17~- This is found in create_web_ctob_loading.sql on the publisher's web site
CREATE OR REPLACE PROCEDURE web_load_clob_from_tile
SET item_desc = empty_clob()
WHERE item_id = item_id_in
RETURNING item_dese INTO descriptor;
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ế độ IN
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 COMMTT trong thủ tục lưu trữ làm cho lớp bị khóa và phạm vi giao tác DML mở cho chương trình web bên ngoài
Những mục trên đã trình bày cách đọc và ghi các cột CLOB va NCLOB trên tầng cơ sở dữ liệu và thông qua các chương trình bên ngoài
Kiểu dữ liệu BLOB có thể định nghĩa một cột trong một table hoặc
nested table Nhu kiểu đữ liệu CLOB, né eó 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
như các ảnh, track nhạc, phim (movie) hoặc các fñile Portable Document Format (PDF) Muc nay xem xét cách bạn có thể upload, ghi và đọc các
kiểu đữ liệu BLOB
Gh cha
Thu kiểu dư liệu CLOB, kiểu da eu BLOB 6 kích có cội lối đa được xác lập bài tham số khối lạo cơ sở dữ lẹu db Heck_ sze Kích cø khái 8KĐ mặc định
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ỉ descriptor 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à cụng 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
Trang 18handle BLOB là đeseriptor (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 BEILE 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 locabor 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 dữ 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
đề 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 nuli reference to a BLOB
vari BLOB := empty_blob{); Declare an empty BLOB
var2 BLOB := '43'l | '41'11'52'; Declare a hexadecimal BLOB for CAR
Có hai cách để tập hợp lại các cột BLOB Bạn có thể tải một file phía
server bằng cách gọi các thủ tục OPEN, LOADBLOBEROMEFILE 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 ngoà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 bị giới hạn chỉ trong các trạng thái NƯLL hoặc NOT NULL Cac BLOB, CLOB va NCLOB 1a NULL, empty, hodc populated như được trình bày trước đó trong bảng 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 thành các lệnh gọi hàm bằng cách bổ sung mệnh dé nay
Mệnh đề RETURNING khai báo một tham số chế độ OƯT hình thức
duéi dang đích của vị ngữ TNTO Mệnh đề neo (anchor) một bộ 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 Hình 8.1 trước đó trong chương này mỉnh họa tiến trình về cách
làm việc của mệnh dé RETURNING INTO
Bạn có thể ghỉ 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 ví giao tác bên trong một
khối SQL hoặc PL/8QL 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 ghỉ.
Trang 19Cá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 nghĩa là phân kênh tham chiếu cột vào một biến cục bộ
một chữ ký hàm Trong câu lệnh INSERT, việc gán bên trong mệnh đề
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 đnsert) 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
Câu lệnh UPDATTE giả định column_name2 là một kiểu đữ liệu BLOB
Nó xác lập giá trị của cột BLOB và sau đó nó trả về locator thông qua
mệnh đề RETURNING INTO đến một biến cục bộ Biến cục bộ được chuyển theo tham chiếu và nó có một chế độ hoạt động OUT Như câu
lệnh INSERT, câu 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.