1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Giáo trình hướng dẫn lý thuyết kèm theo bài tập thực hành Orale 11g tập 2 part 1 potx

38 258 1
Tài liệu được quét OCR, nội dung có thể không chính xác

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 38
Dung lượng 12,16 MB

Nội dung

Trang 2

Hướng dẫn Lý thuyết và kèm theo bài tập thực hành

Trang 4

Lo 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

Trang 5

PHAN 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 6

CHƯỢ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

Trang 7

8 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

Trang 8

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 đố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()

Trang 9

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_đ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' AND REGEXP_LIKE(common_lookup_type,'*(DVDIVHS)*")) Bang 8.1 Các trạng thái dữ liệu BLOB, CLOB va NCLOB Trạng thái Mô tả NULL Cột trong một hàng table chứa một giá trị réng (null) Empty Cột chứa một locator (hoặc descriptor) LOB vốn là một instance rỗng Bạn 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 rỗng

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

Trang 10

Vấ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) chiếu L—— Bộ định vị gọi (Gai Locato) _) —————_ —{ Cơ sở

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

Trang 11

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 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)}) ) pn_value2 [,column_value(n+1)]] )

uel 070 Local vaTdabie; +

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 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

Trang 12

Xác lập giá trị UPDATE table name cột ban đầu SET column_n [—tr— [ee ae: column_name (n+1) = column RETURNING Golumnlvalue2 INTO Thừa kế kiểu dữ t

liệu của cột được Xác lập tên

tham chiếu biến cục bộ ame1 = columm valuel casei value(n+1)]] )

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 file 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 file 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 ngoà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 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

Trang 13

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 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 { sr¢_file_name IN VARGHAR2 , table_name IN VARGHAR2 , column_name IN VARCHAR2 , primary_key_name IN VARCHAR2 , primary_key_value IN VARCHARZ ) 1S Define local variables for DBMS_LOB.LOADCLOBFROMFILE procedure, des_clob CLOB; src_clob BFILE := BFILENAME("BENERIC',src _file_name); des_offset NUMBER := 1; src_offset NUMBER := 1: ¢tx_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

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; ELSE SIF $$DEBUG = 1 $THEN dbms_output.put_tine(‘Failure.’}; SEND RAISE dbms_lob.operation_failed; END IF; END load_clob_from_file;

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

Trang 15

UP-DATE độ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 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_lcokup_id FROM common_lookup

WHERE common_lookup_table = ‘ITEM’

AND common_lookup_column = 'ITEM_TYPE’

AND REGEXP_LIKE(common_lookup_type,"4(dvdlvhs)*",'i')))

LOOP

Call reading and writing CLOB procedure

Trang 16

END; /

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 SELECT item_id , item_title dbms_lob.getlength{item_desc) AS “SIZE” FROM item WHERE dbms_icb.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 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

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 ( item_id_in IN NUMBER , descriptor IN OUT CLOB ) IS BEGIN AFOR UPDATE makes this a DML transaction UPDATE item

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

Trang 18

handle 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

Trang 19

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 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 BLOB, và sau đó nó tra 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: 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ó 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 INSERTJINTO table_rame (€olumn_namel(; column _name2[,column_name(n+1)]] ) VALUES "V92 ESr 45+ mpty blob () (, co] RETURNING |e va Xác lập giá trị Xác lập tên cột ban đầu biến cục bộ Câu lệnh UPDATE

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ó

Trang 20

Xác lập giá trị UPDATE table name cột ban đầu SET column_namel = valuel 2 = [- column_name(nt+1) = column value(n+1)]] ) RETURNING €c 2 INTO [7 Thừa kế kiểu dữ

liệu của cột được Xác lập tên

tham chiếu 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 PIL⁄

S§QL cho dữ liệu ký tự và ghi chúng sang các cột BLOB Mục thứ nhất,

minh 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ở dữ 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 doc cac File va ghi cdc 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 PL/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 đọc

các File và ghỉ 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 DIREGTORY generic AS '/tmp':

Windows

Trang 21

Sau khi tạo 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;

Bước kế tiếp là đọc file va ghi dữ liệu sang cột BLOB Trong khi một

vài đoạn mã nhỏ có thể trình bày các khái niệm, một ví dụ mã hoạt động được cho Ví dụ này sử dụng NDS (Native Dynamic SQL), tham khao néi

dung được để cập trong chương 11

Thủ tục load_blob_from_file sau đây minh họa cách làm điều này:

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

CREATE OR REPLACE PROCEDURE load_blob_from_tile { src_filb_name IN VARCHAR2 , table name IN VARCHAR2 , column_name IN VARCHAR2 , Primary_key_name !N VARCHAR2 , primary_key_value IN VARCHAR2 ) IS Define local variables tor DBMS_LOB,LOADBLOBFROMFILE procedure des_blob BLOB; src_blob BFILE := BFILENAME('GENERIC’,src_file_name); des_offset NUMBER := 1; src_offset NUMBER := 1; ~- Define a pre-reading size

src_blob_ 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_blob) = 1 AND NOT dbms_lob.isopen(sre_blab) = 1 THEN sr¢_blob_size := dbms_{ob.getlength(src_btob); dbms_lob.open(src_blob,DBMS_LOB.LOB_READONLY); END IF; Assign dynamic string to statement stmt := ‘UPDATE ‘1 | table_name I I ''

I1 SET ‘II column_name | 1 ' = empty_blob() ‘

V1 ‘WHERE ‘I | primary_key_name 11" = ‘11 | | primary_key_valuel | *

Trang 22

¬- Run dynamic statement

EXECUTE IMMEDIATE stmt USING OUT des_blob; Read and write file to BLOB

dbms_iob.loadblobfromfile( dest_lob => des_blob , src_bfile => src_blob , amount => dbdms_lob.getlength(src_btob) , dest_offset => des_offset , SI0_0ffSef => src_offset ); Close open source file, dbms_lob.close(sre_blob); Commit write

IF src_blob_size = dhms_lob.getlength(des_blob) THEN

SIF $$DEBUG = 1 $THEN dbms_output.put_line(‘Success!'}; SEND COMMIT; ELSE SIF $$DEBUG = 1 $THEN dbms_output.put_line('Failure '); $END RAISE dbms _lob.operation_failed; END iF; END load_blob_from_file; /

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 BLOB và một khóa chính của cột Sau khi kiểm chứng rằng file hiện

hữu và không mở, lệnh gọi thủ tục DBMS_LOB.OPEN mở 8le ngoài và

đọc nó vào một kiểu đữ liệu BFILE Hàm BFILENAME bảo vệ đường

dẫn thư mục chuẩn tắc từ catalog cơ sở đữ liệu và thêm tên ñile Hàm BEILENAME trả về một tên file chuẩn tắc Câu lệnh UPDATE động xác lập cột BLOB sang một empty_blobQ và sau đó trả cột 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 Chương trình trả về một bộ định vị BLOB và gán nó sang biến des_blob khi câu

Trang 23

"Tất cả hành động trước đọc fñle nguồn và bộ định vị cột BLOB dich

vào phạm vi chương trình Với hai bọ xử lý nguồn tài nguyên này, lệnh gọi đến thủ tục LOADBLOBFROMFILE chuyển nội dung của ñle mở sang bộ định vị BLOB Hoạt động đọc và ghỉ này cho phép đặt trực tiếp

các cụm file lớn vào các cột BLOB Giá trị dịch chuyển file nguồn

(src_offset) và giá trị dịch chuyển cột BLOB đí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 BLOB Bạn có

thể thêm một vòng lặp để tiếp cận việc upload mỗi lần một cụm cho các file nhị phân rất lớn như các phim (movie)

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_blob_from_file.sgl on the publisher's weh site BEGIN FOR i IN (SELECT item_id FROM tem WHERE item title = 'Harry Potter and the Sorcerer''s Stone' AND item_type IN (SELECT common_tookup_id FROM common_lookup

WHERE common_lookup_table = 'ITEM'

AND common_lookup_column = ‘tTEM_TYPE'

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

~- Call procedure for matching rows

load_blob_from_file( src_file_name => ‘HarryPottert.png’ , table_name => ‘ITEM’ , column_name => ‘ITEM_BLOB' , primary_key_name => ‘ITEM_ID’ » primary_key_value => TO_CHAR(iitem_id) ); END LOOP; END; /

Lệnh gọi đến thủ tục load_blob_form_fïle được thực hiện cho mọi giá trị item _id đáp ứng quy tắc nghiệp vụ Biểu thức thông thường nhận

Trang 24

một giá trị chuỗi bắt đầu với một chuỗi con DVD hoặc VHS, nghĩa là các ảnh được tải vào tất cá cột đích cho bất kỳ hàng tương ứng

Bạn có thể chạy phần định dạng và query sau đây để xác nhận hai

hàng bây giờ có các cột BLOB với các luỗông đữ liệu nhị phân dài hơn

~- 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_blob) AS “SIZE" FROM item WHERE dbms_lob.getlength(item_blob) > 0; Nó tạo ra ba hàng sau đây:

ITEM_ID ITEM_TITLE SIZE

1021 Harry Potter and the Sorcerer's Stone 121,624 1022 Harry Potter and the Sorcerer's Stone 121,624

Thư được thảo luận trong phân song song cho các cột CLOB, các ngôn

ngữ lập trình ngoài làm việc với những giới hạn y như thế để upload và

ghỉ các cột BLOB Bạn phải chọn ngôn ngữ và phương pháp nào làm việc

tốt nhất cho tổ chức của bạn Mục này giả định bạn muốn upload toàn bộ

ảnh dưới dạng một file nhị phân (binary)

Giải pháp sau đây tạo một thủ tue PL/SQL hé trg bất kỳ ngôn ngữ lập

trình web ngoài nào làm việc với các thư mục Oracle JDBC hoặc OCI8 Nó cho phép bạn xác lập lại và thêm một giá trị cột BLOB hoàn chỉnh, nhưng bạn nên nhớ rằng các fñle lớn quá sẽ được ghi đưới đạng các cụm

~ This is found in create_web_blob_loading.sql on the publisher's web site

CREATE OR REPLACE PROCEDURE web_load_blob_from_file

{ item_id_in IN NUMBER

, descriptor IN OUT BLOB } IS

Trang 25

A FOR UPDATE makes this a DML transaction UPDATE item

SET item_blob = empty_blob()

WHERE item jd = item_id_in

RETURNING item_blob INTO descriptor;

END web_load_blob_from_tile;

/

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

file thư viện PHP 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ị BLOB với một sự truy cập chế độ IN OUT Thi hai, ménh dé RETURNING INTO cung cap 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 COMMIT lam cho BLOB bị khóa và phạm vi giao tác DML mở cho các chương trình web ngoài

Những mục trên đã trình bày cách đọc và ghí các cột BLOB trên tầng

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

SecureFiles

SecureFiles là các đối tượng lớn đặc biệt Chúng được khai báo bằng

những tham số lưu trữ đặc biệt vốn cho bạn mã hóa, nén và và hủy sao chép chúng

Oracle 11g cho phép lưu trữ SecureFiles trong các cột BLOB, CLOB và NCLOB 8ecureFiles cho phép mã hóa, nén và hủy sao chép các LOB Chúng làm việc theo nguyên tắc Transparent Data Encryption (TDE) va sử dụng một Oracle Wallet làm khóa mã hóa

Gh chit

TDE cho bạn chọn một thuật tốn mã hóa khơng mặc định Bạn có thể chọn từ những thuật toán mã hóa sau đây:

@ 3DES168 @ AES128

® AES192 (default) @ AES256

Bạn có thể kiểm tra xem instance có được cấu hình để làm việc với SecureFiles hay khéng bằng cách truy vấn khung xem (view) v$parameter

Query và định dạng SQL*Plus là

Trang 26

COLUMN vaiue FORMAT A14

SELECT name, value FROM v$parameter WHERE name LIKE ‘db_securefile’;

Ít ra bạn nên có các đồng sau đây để làm việc với SecureFiles:

db_securefile PERMITTED|

Bước tiếp theo đòi hỏi bạn thiết lập một password mã hóa trong một

'Wallet Oracle 11g Cách dễ nhất để cấu hình Wallet là chạy Oracle 11g Wallet Manager

Các lệnh được ghi chú ở đây: kinux hoặc Dnix

# SORACLE_HOME/bin/owm

Windows

C:> %ORACLE_HOME%\bin\launch.exe “oracle_canonical_path\bin” owm.cl

Lénh menu cé 1é dé hon Né6 1a: Start | Programs | Oracle - Oracle

Home ! Integrated Management Tools | Wallet Manager Bén trong Wallet Manager, ban c6 thể tạo một khóa mã hóa Bạn nên lưu nó sang vị trí mặc định, đó là Linux hode Unix /etc/ORACLEAVALLETS/username Windows %USERPRDFILE%AORACLEWWALLETS

%ÚSERPROFILE% ánh xạ sang tên user trên một nền Windows

“Trên một số nên, bạn phải đặt các hướng dẫn vào file sạlnet.ora mà bạn sẽ tìm thấy trong thư mục /network/admin (các dấu gạch chéo ngược cho

Windows) cla Oracle Home Tén file wallet 14 ewallet.p12 Bạn nhập các dòng sau đây trong file sqlnet.ora:

ENCRYPTION_WALLET_LOCATION =

(SOURCE =

(METHOD = FILE)

Trang 27

Sau khi đọc password Wallet, bạn tạo một tablespace đặc biệt cho SecureFiles như

CREATE TABLESPACE securefiles

DATAFILE ‘<canonical_path>\sec_file.dbf' SIZE 5M

EXTENT MANAGEMENT LOCAL

SEGMENT SPACE MANAGEMENT AUTO;

Giữ hài hòa với ví dụ cửa hàng video, bạn sẽ thêm một cột CLOB secure file vào table item Cú pháp sau đây cho phép tạo cột mới dưới dạng một secure file:

ALTER TABLE item ADD (sec_file CLOB) LOB(sec_file)

STORE AS SECUREFILE sec_file (TABLESPACE securefile);

Bây giờ bạn có thể thay đổi và mã hóa cột:

ALTER TABLE item MODIFY LOB(sec_file) (ENCRYPT USING '3DES168') Bây giờ bạn có một cột được mã hóa trong table item Bất kỳ LOB được lưu trữ bên trong hỗ trợ SecureFiles, nhưng bạn nên đặt chúng

trong tablespace riêng của chúng

Các file Binary: Kiểu dữ liệu BFILE

Kiểu đữ liệu BFILE (binary file) làm việc khác với các kiểu dữ liệu

BLOB, CLOB, và NCLOB tương ứng Các điểm khác biệt lớn nhất là các

giá trị BEILE là những kiểu đữ liệu LOB read-only (chỉ đọc) và được lưu trữ bên ngoài cơ sở đữ liệu Không giống như các kiểu đữ liệu BLOB, CLOB và NCLOB, BETLE có một kích cỡ vật lý tối đa được xác lập bởi hệ điều hành -

Các BFILE ngoài tượng trưng cho đữ liệu không phù hợp trong các

kiểu dữ liệu chuẩn, chẳng hạn như các ảnh (image), các ñle PDF, tài liệu

Microsoft Office vA movie QuickTime Những file ngoai nay lién quan

đến các thành phân nghiệp vụ bên trong cơ sở dữ liệu bằng cách lưu trữ

một bộ mô tả file ngoài trong một cột BFILE Nói chung, chúng được phục vụ cho các khách hàng Internet hoặc intranet thông qua các trình duyệt web Các trình đuyệt web sử dụng loại nội dung MIME để hiểu

chúng sẽ kết xuất những tài liệu này như thế nào, điều này thường đòi hỏi các plug-in trình đuyệt để quần lý sự truy cập và hiển thị

Mục nhỏ đâu tiên khai thác cách bạn cấu hình và sử dụng cơ sở dữ liệu để tận dụng các file ngoài được tham chiếu đưới dang cdc cot BFILE

Bạn sẽ thiết lập một thư mục ảo khác (như các thư mục trong các phần trước), định nghĩa một bộ định vị BEILE và kiểm tra cách các thư mục

Trang 28

BETILE ngoài như thế nào Đểng bộ hóa các thư mục ảo Apache va Oracle là một chiến lược triển khai truyền thống khi sử dụng các ñle nguồn

BEILE ngoài

Mục nhỏ thứ hai hướng dẫn cách mở rộng catalog cơ sở đữ liệu và đọc

các tên file chuẩn tắc nhằm đơn giản hóa cách bạn gọi các ñle ngoài từ những chương trình phía server Điều này hữu dụng khi bạn muốn lưu

trữ cdc file bén trong trong cơ sở đữ liệu

Tao và sử tụng cát thí mực ảo

Các thư mục ảo (virtual directories) giống như các từ đổng nghĩa (synonyms); ching tré vào một thứ khác - một thư mục vật lý trên hệ

điểu hành Các tên thư mục ảo và vật lý được lưu trữ trong catalog cơ sở

đữ liệu và có thể xem trong khung xem đba_đirectories Những người

dùng cơ sở đữ liệu có thể xem chúng khi họ được cấp phát đặc quyển

SELECT trên khung xem hoặc vai trò SELECT_CATALOG_ROLE Theo

mặc định, người dùng SYSTEM truy cập khung xem đba_đirectories

thông qua vai trò SELECT_CATALOG_ROLE

Bạn thường tạo các thư mục ảo đưới dạng người dùng SYSTEM hoặc

một người dùng cơ sở dữ liệu khác tận hưởng đặc quyên vai trò DBA

Hoặc, người dùng SYSTEM có thể cấp phát đặc quyền CREATE ANY

DIRECTORY cho một người dùng, Điều này giảm bớt gánh nặng từ DBA

nhưng có thể dẫn đến việc sinh sôi nảy nở của các thư mục ảo và những xung đột tiểm ẩn trong việc đặt tên Nói chưng bạn không nên cho phép những người dùng ngoại trừ DBA tạo các thư mục

Tất cả các thư mục ảo thật ra do người dùng SYS sở hữu Thư mục vật lý luôn là đường dẫn chuẩn tắc, nghĩa là một đường đẫn thư mục được

xác định đầy đủ Một đường dẫn chuẩn tắc Linux hoặc Unix bắt đầu tại

một điểm cài đặt (mount) và kết thúc tại thư mục mong muốn Một

đường dẫn file chuẩn tắc Windows bắt đầu tại mẫu tự ổ đĩa vật lý và như trong Linux hoặc Unix kết thúc tại thư mục mong muốn

Bạn nên kết nối đưới dạng người dùng SYSTEM và định nghĩa một

thư mục ảnh ảo Các lệnh sau đây làm việc trên hệ điều hành riêng biệt

của bạn:

Linux hodc Unix

CREATE DIRECTORY images As ‘/varfwww/htmtsimages'; Windows

CREATE DIRECTORY images AS ‘C:\Program Files\Apache

Trang 29

Sau khi tạo thư mục ảo, dưới dạng người dùng SYSTEM bạn cần cấp

phát các quyền đọc trên thư mục cho người dùng plsgl Cú pháp là GRANT READ ON DIRECTORY images TO plsql;

Các bước kế tiếp thường bao gồm tạo một bí danh (alias) và thư mục ao trong file Apache httpd.conf Néu ban muén céu hinh bi danh va thu myc ao Apache, bạn có thể xem phần “Tạo một bí danh và thư mục ảo Apache” C6 nhiing ly do rat tốt để xác lập các bí danh và thư mục ảo

trong Apache Theo quy tắc, bạn phải mirror định nghĩa trong bí danh và thư mục ảo Apache với cấu hình của thư mục ảo cơ sở đữ liệu Oracle Có quy tắc bởi vì thủ tục FILENAME của gói DBMS_LOB cung cấp chỉ tên ñle cơ sở; nó không cung cấp một phương tiện để tìm các tên file

chuẩn tắc Các tên fñile chuẩn tắc là sự kết hợp của các đường dẫn chuẩn tắc và các tên file cơ sở dữ liệu

Tạo một bí danh và thư mục ảo Apache

Hai bước cấu hình Apache là bắt buộc khi bạn muốn bật một thư mục ảo

mới Bạn cần cấu hình một bí danh và thư mục trong file httpd.conf nhu sau

cho nền tương ứng của bạn Linux Alias /images/ “/varAvww/html/images” <Directory “/varAwww/htmi/images”> Options None AllowOverride None Order allow,deny Allow from all </Directory> Windows

Alias /images/ “C:/Program Files/Apache Group/Apache2/htdocs/images/” <Directory “C:/Program Files/Apache Group/Apache2/ntdocs/images”> Options None AllowOverride None Order allow,deny Allow from all </Directory>

Sau khi bạn thực hiện những thay đổi này trong file cấu hình Apache, bạn phải dừng và khởi động instance Apache Bạn sử dụng đồng hồ Apache trên một hệ thống Windows và script apachectl shell trên các hệ thống

Linux hoặc Unix

Trang 30

Như bạn đã thấy trong các mục “PL/SQL đọc các File và ghi các cột CLOB hoặc NCLOB” và “Đọc các File và ghi các cột BLOB”, bạn có thể

mé mét file trong khéi PL/SQL mà không cần biết đường dẫn chuẩn tắc

Điều này xảy ra bởi vì thủ tục OPEN trong gói DBMS_LOB phân giải nó cho bạn Khi bạn đọc fle thông qua thư mục ảo bằng cách sử dụng thủ

tục OPEN, bạn phải cung cấp một module riêng biệt để kết xuất các ảnh trong các trang web Điều này là bắt buộc bởi vì fñle đã được chuyển đổi thành một luông byte thô khi được mở để đọc Bất cứ lúc nào bạn đọc file dưới dạng một luễng byte, bạn phải chuyển đổi file trở lại thành một

ảnh khi kết xuất nó trong một trang web Mục trước “PHP Upload các File và ghi các cột BLOB” trong chương này thảo luận tại sao việc chuyển

đổi là cần thiết

Bạn nên sao chép file Raiders3.png từ web site của nhà xuất bản và đặt nó trong thư mục vật lý dành riêng cho nền của bạn ánh xạ sang thu mục ảo images trong cơ sở đữ liệu Bạn có thể tìm thấy thư mục hệ thống

vật lý đó (hoặc đường dẫn chuẩn tắc) bằng cách viết query sau đây dưới

dạng người dùng SYSTEM:

SELECT * FROM dba_directories WHERE directory_name = ‘IMAGES’;

Sau khi bạn đã cấu hình thư mục ao va dat file Raiders3.png trong

đúng thư mục, bạn chèn một locator BFILE vào một cột cơ sở đữ liệu để

test Bạn có thể sử dụng câu lệnh sau đây để cập nhật một cột bằng một

locator BFILE:

UPDATE item

item_photo = BFILENAME('IMAGES‘, ‘Raiders3.png’) WHERE item_id = 1055;

Ban cần commit việc cập nhật Nếu bạn quên bước đó thì sau đó bạn

có thể nhận được một lỗi trình duyệt cho bạn biết rằng ảnh không thể được hiển thị bởi vì nó chứa các lỗi Đây là lỗi chuẩn khi cột BFLLE trả về một giá trị rỗng hoặc luông rỗng

COMMIT;

Ban có thể kiểm chứng rằng ñle hiện hữu và thư mục áo phân giải Xác nhận sự tổn tại của fñle trước khi cố mở nó cung cấp cho chương trình của bạn thêm khả năng điều khiển Khối nặc danh sau đây cho

bạn xác nhận sự tổn tại của ñle và nhận được kích cỡ file của nó Hiển nhiên, bạn phải bật SERVEROUTPUT trong SQL*Plus để xem

bất kỳ kết quả:

SQL> SET SERVEROUTPUT ON SIZE 1000000

Sau đó, bạn có thể chạy chương trình khối nặc danh này

Trang 31

DECLARE file_locator BFILE; BEGIN SELECT item_photo iNTO file_locator FROM item WHERE item_id = 1055; IF dbms_lob.fileexists(file_locator) = 1 THEN dbms_output.put_tine(‘File is: ['l | dbms_lob.getlength(file_locator)I | T) ELSE dbms_output.put_line(‘No file found.‘); END IF; END; /

Hàm DBMS_LOB.FILEEXISTS đã được tạo để làm việc trong cA SQL

và PL/SQL Vì SQL không hỗ trợ một kiểu dữ liệu Boolean riêng, hàm trả về 1 khi nó tìm thấy một file và 0 khi nó thất bại Khối nặc danh trả về kết quả sau đây:

File is: [126860]

Nếu bạn đã thêm thành công một bí danh images và một thư mục ảo

vào một ñle Apache httpđ.conf, bạn có thể hiển thị file bing cách sử

dụng DRL sau đây:

http://<hostname>.<domain_name>/images/Raiders3.png

Tình 8.2 minh họa file ảnh được tìm thấy bởi URL Bạn nên chú ý sự

khác biệt và sự tương đồng giữa các tiêu dé trình duyệt của các hình 8.2

và 8.3 Hình 8.3 cho biết một chương trình PHP đã tạo ra trong ảnh trong khi hình 8.2 cho biết một ảnh đã được đọc từ server Cả hai sử dụng các đấu ngoặc đơn để xác nhận ánh PNG được kết xuất và các kích

thước pixel của nó,

Trong khi cơ sở đữ liệu có thể đọc file mà không có bí danh và thư mục

Trang 32

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

9 Raiders3.png (PNG Image, 201x300 pixels) - Mozilla Firefox Bề, UX nh Hy: Bioline Toe

|@- 2 - Œ G (iBmamammsmmxjwj|Gl: |)

ad

Hình 8.2 File PNG được kết xuất dưới dạng một ảnh (201 x 300 pixel)

Chương trình ConvertFileTolmage.php sau đây trình bày cách ban

đọc một file ngồi thơng qua một thư mục cơ sở dữ liệu ảo, chuyển đổi nó từ một fñle thành một luồng byte và chuyển đổi nó từ một luồng byte

thành một ảnh Chương trình này có thể đọc một file vật lý từ bất kỳ thư

mục cơ sở dữ liệu ảo bởi vì chương trình tận dụng catalog cơ sở dữ liệu để

phân giải vị trí file vật lý

This is found in ConvertFileTolmage.php on the publisher's web site

<?php

// Return successful attempt to connect to the database

if ($c = @oci_new_connect(“plsql”,”plsql”,”orcl”)) { // Declare input variables

(isset($_GET['id'])) ? $id = (int) $_GET[‘id'] : $id = 1021:

// Declare a SQL SELECT statement returning a CLOB

$stmt = “SELECT item_photo FROM item WHERE item_id = :id”; // Parse a query through the connection

$s = oci_parse($c,$stmt);

// Bind PHP variables to the OCI types oci_bind_by_name($s, ':id' $id); // Execute the PL/SQL statement if (oci_execute($s)) {

Trang 33

?> while (oci_fetch($s)) { for ($i = 1;$i <= oci_num_fields($s);$i++) if (is_object(oci_result($s,$i))) { if ($size = oci_result($s,$i)->size()) { $data = oci_result($s,$i)->read($size); } else $data = "&nbsp;"; } else { if (oci_fietd_is_null($s, $i)) $data = “&nbsp;"; else $data = oci_resutt($s,$i); }} /f Free statement resources oci_free_statement($s); // Print the header first header('Content-type: image/png’); imagepng{imagecreatefromstring($data)}; } # Disconnect from database oci_close($c); } else { / Assign the OCI error and format double and single quotes SerrorMessage = oci_error(); print htmlentities($errorMessage|'message’])."<br />”; }

Chương trình đọc bộ định vị BFILE mà sau đó ngắm định mở BFILE

vào một luồng nhị phân (binary stream) Luông nhị phân được đọc bởi phương thức OCI8 readQ được chuyển đổi thành một nguén tài nguyên file béi ham imagecreatefromstring() va được chuyển đổi thành một ảnh bởi hàm imagepngQ Hình 8.3 minh họa ảnh hiển thị từ chương trình này

Một phương pháp khác để kết xuất các file ảnh đòi hôi những gì được

gọi là sự ghép đôi cấu trúc giữa các thư mục Apache do va thu mục cơ sở

đữ liệu ảo Điều này có nghĩa bạn định nghĩa thư mục ảo cơ sở đữ liệu là images khi bạn cũng định nghĩa bí danh Apache là images Điều này cho bạn xây dựng một đường dẫn tương đối đi đến vị trí file ảnh trong phần tử src của thẻ img Nó cũng tránh vấn đề chuyển đổi một luông nhị

Trang 34

Hình 8.3 Cột BFILE được kết xuất dưới dạng một ảnh PNG (201 x 300 pixel) Tone

Bước đầu tiên trong việc hoàn thành loại phương pháp này đòi hỏi một hàm wrapper bao quanh thử tục EILEGETNAME của gói DBMS_LOB Hàm get_bñlename phân phối wrapper đó Bạn có thể tái sử dụng chương trình này cho những table khác bởi vì nó sử dung NDS (Native Dynamic SQL) để truy vấn và trả về dữ liệu Việc bao bọc câu

lệnh SELECT bao quanh khối nặc danh sẽ cho bạn dễ dàng thu thập giá trị trả về Bạn sẽ tìm hiểu thêm về DNS trong chương 11

This is found in get_bfilename.sql on the puhlisher's web site

Trang 35

directory_num EXCEPTION; PRAGMA EXCEPTION_INIT(directory_num,-22285); BEGIN Wrap the statement in an anonymous block to create and OUT mode variable stmt := 'BEGIN ' It ‘SELECT ‘I | column_name ||‘ ' If ‘INTO :locator ' 1 | 'PROM 'I 1 table_name I ï ' " JI "WHERE 'I | primary_key_namei | ' = '† | ”*1 I primary_key_valuel JI 'END;;

Return a scalar query result from a dynamic SQL statement

EXECUTE IMMEDIATE stmt USING OUT locator; Check for available locator

IF locator IS NOT NULL THEN

dbms_lob.filegetname(locator, dir_alias, file_name); END IF; Return filename RETURN delimiterl | LOWER(dir_alias)! | delimiter! | filename: EXCEPTION WHEN directory_num THEN RETURN NULL; END get_bfilename; ?

dir_alias là tên thư mục cơ sở đữ liệu ảo Hàm trả về đìr_alias, a /(dấu

gạch chéo tiến), và một tên file cơ sở Giả sử ban sit dung file Raiders3.png,

bạn có thể gọi hàm độc lập thông qua mét query:

SELECT get_bfilename('ITEM', ITEM_PHOT0','ITEM_ID','1055°) AS directory FROM dual; Nó sẽ trả về: DIRECTORY /images/Raiders3.png

Chương trình QueryRelativeBFILE.php sử dụng giá trị trả về get_bfilename làm phân tử sre của thể img Điều này chỉ làm việc khi bí

Trang 36

PHP gọi đến hàm get_bñlename và trả về giá trị dưới dạng phân tử thứ ba trong query Chương trình PHP giả định rằng đường dẫn ảo là chuỗi duy nhất được trả về với một dấu gạch chéo tiến / đứng trước Có lẽ bạn muốn khai thác những lựa chọn khác khi bạn có nhiều vị trí ảnh trong

một hàng đữ liệu

Sau đây là QueryRelativeBFILE.php:

This is found in QueryRelativeBFILE.php on the pubtisher's web site <?php

4 Declare input variables

(isset($_GET['id'})) ? $id = (int) $_GET[‘id’] ; Sid = 1021;

/f Call the local function query_insert($id); // Query results after an insert function query_insert($id) { if Return successful attempt to connect to the database, if ($c = @oci_connect(“plsqt”,"plsql”,"orcl")) { if Declare a SQL SELECT statement returning a CLOB $stmt = “SELECT item_title , item_desc get_bfilename(‘ITEM’,'ITEM_PHOTO’,"ITEM_ID",:id) FROM item

Trang 37

$data = “ânbsp;”; } else { if (oci_field_is_nutl($s,$i)) $title = "&nbsp;”; else if (substr(oci_result($s,$i),0,1) == ‘/') $photo = oci_result($s,$i); else

$title = oci_result($s, $i); } } # End of the while(oci_fetch($s)) loop

if Free statement resources oci_free_statement($s};

Trang 38

Trong khi QueryRelativeBFILE.php làm việc cho các giải pháp trên web, nó không làm việc cho các chương trình phía server vốn đòi hỏi tên

file chuẩn tắc, đây luôn là một giá trị tuyệt đối Nó ít tốn kém hơn về

những nguồn tài nguyên máy bởi vì nó chỉ đọc file ảnh và phục vụ nó cho

server Apache Những vấn đề với phương pháp này gồm hai phần Thứ nhất, bạn có một nhiệm vụ quản trị để đồng bộ hóa hai thư mục ảo Thứ hai, bất kỳ người dùng có thể xem nguồn và xác định một số thông tin về cấu trúc file vật lý của bạn Là một biện pháp phòng ngừa an ninh, chiếm một lượng nhỏ hao phí để xáo trộn (làm ẩn) vị trí của các file là một điều tốt Tương tự, loại bỏ công việc đồng bộ hóa các thư mục ảo

Apache và Oracle 11g làm cho việc ứng dụng của bạn bảo trì ít tốn kém

hơn Hình 8.4 minh họa kết quả từ mẫu truy vấn ảnh tương đối này

foc cdc tén dudng tiẫn và tên File chuẩn tắc

Phần này minh họa cách bạn có thể chỉnh sửa catalog cơ sở dữ liệu và

cho phép những chương trình bién dich locator BFILE bao vệ an toàn

tên đường dẫn và tên fle chuẩn tắc Bạn phải mở các quyển (permis- sions) để bảo vệ an toàn thư mục ảo được sở hữu bởi người dùng SYS

Theo quy tắc chung, bạn nên cho phép truy cập các đối tượng SYS một

cách cẩn thận và cho phép chỉ sự truy cập tối thiểu được yêu cầu khi xây dựng các ứng dụng cơ sở dữ liệu Điều này thường chuyển đổi thành một tiến trình hai bước Thứ nhất, cấp phát đặc quyển từ SYS đến SYSTEM Thứ hai, đóng gói đặc quyền bằng cách viết một hàm thủ tục hoặc thủ tục lưu trữ (và cũng đừng quên bao bọc nguồn khỏi những cặp mắt tò

mò) :

Ngày đăng: 10/08/2014, 21:23

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN