Để bắt đầu, bạn cần hiểu LOB là gì. Chúng là "dữ liệu lớn", có thể lớn hơn bất kỳ kiểu dữ liệu nào khác trong Oracle. Chúng giống như các tệp thông thường trên hệ thống tệp. Để ghi vào một tệp trên một mục tệp, bạn sẽ phải
- mở tệp để ghi
- cắt bớt tệp nếu bạn muốn bắt đầu điền từ đầu
- đọc dữ liệu nguồn của bạn thành nhiều phần trong một vòng lặp
- nối các phần dữ liệu của bạn vào tệp trong cùng một vòng lặp, từng phần một
- đóng tệp
Ít nhiều điều tương tự cũng đúng đối với LOB. Trong bảng của bạn, cột LOB (CLOB / BLOB / NCLOB) chỉ là một con trỏ / tham chiếu đến một vị trí khác trên ổ đĩa lưu trữ dữ liệu thực tế của bạn. Theo thuật ngữ tiêu chuẩn của Oracle, con trỏ được gọi là "LOB locator". Bạn cần phải
- mở / khởi tạo bộ định vị LOB
- cắt bớt nội dung LOB, nếu bạn muốn bắt đầu điền từ đầu
- nối các phần dữ liệu của bạn vào nội dung LOB trong một vòng lặp, từng phần một
- đóng bộ định vị LOB
Trong PL / SQL, nó có thể trông như thế này:
-- create table blob_test(id number, b blob);
declare
v_b blob;
aaa raw(32767);
longLine varchar2(32767);
begin
longLine := LPAD('aaaa', 32767,'x');
aaa := UTL_RAW.CAST_TO_RAW(longLine);
insert into blob_test values(1,empty_blob()) returning b into v_b;
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
dbms_lob.writeappend(v_b,UTL_RAW.LENGTH (aaa) ,aaa);
dbms_lob.close(LOB_LOC=>v_b);
commit;
end;
Giải thích:
- khởi tạo bộ định vị LOB =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- mở trình định vị LOB để ghi =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- cắt bớt nội dung LOB, nếu bạn muốn bắt đầu điền từ đầu ... Việc này được thực hiện bởi
empty_blob()
gọi tronginsert
. - nối các phần dữ liệu của bạn vào nội dung LOB trong một vòng lặp, từng cái một =ở đây chỉ một lần lặp lại của
dbms_lob.writeappend()
, chỉ thêm một đoạn duy nhấtaaa
of lengthutl_raw.length(aaa)
(tối đa là 32767) vào LOBv_b
- đóng bộ định vị LOB =
dbms_lob.close(LOB_LOC=>v_b);