===================== PL/SQL LOB ===================== 讒... 觜′ 伎 蟶 螳給... 襷襷豺 蟲... る狩伎 螻蠍蠍磯レ 覲願給.. 蠏語 LOB 蟯伎 誤 覲願...襦貅危, DBMS_LOBれ 覯 覲願給.. ========================================= 一危襯 豌襴蠍 一危 ========================================= BLOB : 蟲譟壱 讌 伎 一危襯 , 豕 4蠍郁 --> 碁 CLOB : 蟲譟壱 讌 覓語 一危襯 , 豕 4蠍郁 --> 企 NCLOB : ル 覓語 一危 れ 蟲螳 語 讌蠍磯 , 豕 4蠍郁 --> 企 BFILE : 蟲譟壱 讌 一危襯 一危覯伎 碁 , 豕 4蠍郁 --> 企 ======================== る語 ======================== - 企ろ磯 - group by, order by, select distinct, join覓語企 讌 - 覿磯螳 - varray ========================== LOB LONG 一危 觜蟲 ========================== LOB LONG --------------------------------- ----------------------------- LOB リ 襷 一危 螳讌 一危 螳讌 貉殊 LOB 襦貅危磯 豌願 貉殊 (LOB 蠍郁 3964覦危語企 貉殊 ) LOB 貉殊 蠏狩 襦貅危郁 覦 豌願 覦 4GB蟾讌 2GB蟾讌 ろ 語り 豌覿 豺蟾讌 ′語 讌螻 覿磯 蟆曙 覈 覲旧螳 覲旧 覿螳 ================================== LONG 一危 LOB襦 覲蠍 ================================== TO_LOB襯 覃 ...(覯 磯 襴伎 ... 讌覿 覃伎殊 谿瑚..) <覓碁> TO_LOB (LONG 螳) 蟒 碁螳 朱Μ 螳... ================== 碁 蠍 ================== 碁 殊 る 襷 る狩伎 一危覯伎る伎 ル 一危 蠏狩 蟆 伎豌伎 殊 蠏狩る 蟆.. 企 蠍磯レ 蟆 BFILE 螳豌伎... 碁殊 語 る 襾殊 襴 螳豌企ゼ 燕伎狩... <----------------------- 覦 襴 螳豌 燕..!!!!!!!! れ 覓碁.. CREATE [OR REPLACE] DIRECTORY 襴企 AS 蟆暑 - 襴 螳豌伎 企 豕 30蟾讌 - 殊企 2000蟾讌 襾殊 れ旧 一 F:\Books朱 襴襯 燕螻 蠏碁狩 9螳襯 讌企l給.. 蠏碁壱 襴 る碁ゼ 燕企慨蟆給.. SQL> connect yasi/yasi 郁屋給. SQL> create or replace directory books_dir as 'F:\Books'; 襴螳 焔給. ================= BFILE ================= - 碁 讌讌 . - 殊 所鍵 朱 企Π. - too many files open る襯 譟一伎 .. 願屋 朱誤 殊 SESSION_MAX_OPEN_FILES = 20 螳 譟一.. 伎豌伎 蟲 螻ろ螻, 殊 伎 覦 譯殊伎 . 蠏碁讌 朱 讌 螻 企Π朱 蠍磯伎, れ襦 殊 危襦 ′語ろ螻 磯 襯 覦蟆 . る螳 覦 覈 殊 覦 .. ===================================== BFILE螻 蟷 DBMS_LOB れ 蠍 ===================================== 朱 DBMS_LOB れ襯 蠍 伎 れ螻 螳 2螳讌 ろ襴渚碁ゼ ろ..817 覯 讌.. SQL> @ORACLE_HOME/rdbms/admin/dbmslob.sql SQL> @ORACLE_HOME/rdbms/admin/prvtlob.plb る狩伎 碁 LOB襷 襯 磯 螻牛.. れ 蠏 曙.. or襦 螳ル一危 る ------------ ------------------ -------------------------------------------------------------------------------- BFILENAME BFILE PL/SQL 觚襦企 企 殊 豺 誤(襦貅危)襯 COMPARE ALL LOB LOB襯 豌 朱襯 觜蟲 FILECLOSE BFILE BFILE 襦貅危一 郁屋 殊 . FILECOLOSEALL BFILE BFILE 覈 . FILEEXISTS BFILE 襦貅危郁 殊 伎 り 螳襴る 豺 殊 譟伎讌襯 蟆. FILEGETNAME BFILE BFILE 襴 る語 蟆暑襯 覦. FILEISOPEN BFILE 殊 企 企 讌襯 蟆. FILEOPEN BFILE れ襦 殊 磯 GETLENGTH ALL LOB LOB れ 蠍語企ゼ 覦. INSTR ALL LOB LOB 讌 覓語 ろ碁螻 殊 伎 谿城. READ ALL LOB 讌 襷 LOB襯 覯朱 曙 れ碁. BSUBSTR ALL LOB 朱誤一 伎 讌 豌 朱 LOB襯 覦. 螳螳 覈 蟆 .... BFILE る 襯 50%蟆 伎 蟆... 譴 BFILE れ螻 螳給.. - 朱 企 襦貅危郁 ル蠍 伎 BFILENAME襯 伎伎 . - 殊 企 一一 , 蠏 殊 譟伎讌 FILEEXISTS襯 伎 誤伎 .. - BFILE 蠍 FILEISOPEN襯 伎 蠏 殊 企 企 讌 誤伎 . - 碁 殊 語ろる 襾殊 FILEOPEN襦襯 伎 蠏 殊 伎伎 .. - READ襦襯 伎 殊 朱 豌企ゼ 讌 覃覈襴襦 曙企れ 給.. - 殊 曙朱 覦 FILECLOSE襦襯 伎伎 殊 給.. - 覈 BFILE 豌襴襯 碁 FILECLOSEALL 襦襯 牛伎 語 .. 讌 襯 牛伎 企.. れ BFILE 願, BFILE 螻, FILEEXISTS, FILEISOPEN る襯 蟆螻, GETFILENAME 伎 襴 螳豌伎 手化襦襯 蟆 .. DECLARE /* This Anonymous PL/SQL block will demonstrate how to open a BFILE, close the BFILE, and do some error checking with FILEEXISTS, FILEISOPEN, and retrieve the Directory Object and Path with GETFILENAME */ v_BOOKFILE BFILE; -- BFILE to access v_DIRNAME VARCHAR2(30); -- Holds Directory Object for FILEGETNAME v_LOCATION VARCHAR2(2000); -- Holds filename for FILEGETNAME v_FILEISOPEN INTEGER; -- Holds status to check if the file is open v_FILEEXISTS INTEGER; -- Holds status if the file actually exists BEGIN v_BOOKFILE := BFILENAME('BOOKS_DIR','BOOKS1.JPG'); -- Create Locator v_FILEISOPEN := DBMS_LOB.FILEISOPEN(v_BOOKFILE);-- Check if file open v_FILEEXISTS := DBMS_LOB.FILEEXISTS(v_BOOKFILE); IF v_FILEEXISTS = 1 THEN DBMS_OUTPUT.PUT_LINE('The file exists'); ELSE DBMS_OUTPUT.PUT_LINE('The file cannot be found'); END IF; IF v_FILEISOPEN = 1 THEN --Determine actions if file is opened DBMS_OUTPUT.PUT_LINE('The file is open'); ELSE DBMS_OUTPUT.PUT_LINE('Opening the file'); DBMS_LOB.FILEOPEN(v_BOOKFILE); END IF; DBMS_LOB.FILEGETNAME(v_BOOKFILE,v_DIRNAME,v_LOCATION); DBMS_OUTPUT.PUT_LINE('The Directory Object is: ' || v_DIRNAME || ' The File Name is: ' || v_LOCATION); DBMS_LOB.FILECLOSE(v_BOOKFILE); -- Close the BFILE END; / れ襦 企語襯 覲企る.....企殊伎誤 襦蠏碁 狩...觜覯..觜煙... れ 殊 觜蟲螻 殊 蠍語企ゼ 蟲 . DECLARE /* The purpose of this anonymous PL/SQl block is to compare the contents of three files completely. The size of the files is determined by the GETLENGTH function */ v_FILE1 BFILE; v_FILE2 BFILE; v_FILE3 BFILE; v_GETLENGTH1 INTEGER; -- Hold length of the file v_GETLENGTH2 INTEGER; -- Hold length of the file v_GETLENGTH3 INTEGER; -- Hold length of the file v_COMPARELENGTH INTEGER; -- Holds smallest of two values v_COMPARERESULT INTEGER; -- Hold result of comparing files BEGIN -- Create three locators for each of the files to compare v_FILE1 := BFILENAME('BOOKS_DIR','BOOKS1.JPG'); v_FILE2 := BFILENAME('BOOKS_DIR','BOOKS2.JPG'); v_FILE3 := BFILENAME('BOOKS_DIR','BOOKS5.JPG'); -- Open the files for access DBMS_LOB.FILEOPEN(v_FILE1); DBMS_LOB.FILEOPEN(v_FILE2); DBMS_LOB.FILEOPEN(v_FILE3); v_GETLENGTH1 := DBMS_LOB.GETLENGTH(v_FILE1); v_GETLENGTH2 := DBMS_LOB.GETLENGTH(v_FILE2); v_GETLENGTH3 := DBMS_LOB.GETLENGTH(v_FILE3); -- Compare 1st and 2nd File IF v_GETLENGTH1 < v_GETLENGTH2 THEN v_COMPARELENGTH := v_GETLENGTH1; ELSE v_COMPARELENGTH := v_GETLENGTH2; END IF; v_COMPARERESULT := DBMS_LOB.COMPARE(v_FILE1,v_FILE2, v_COMPARELENGTH,1,1); IF v_COMPARERESULT = 0 THEN DBMS_OUTPUT.PUT_LINE('Both Files Are Identical'); ELSE DBMS_OUTPUT.PUT_LINE('Both Files Are Different'); END IF; -- Compare 1st and 3rd file IF v_GETLENGTH1 < v_GETLENGTH3 THEN v_COMPARELENGTH := v_GETLENGTH1; ELSE v_COMPARELENGTH := v_GETLENGTH3; END IF; v_COMPARERESULT := DBMS_LOB.COMPARE(v_FILE1,v_FILE3, v_COMPARELENGTH,1,1); IF v_COMPARERESULT = 0 THEN DBMS_OUTPUT.PUT_LINE('Both Files Are Identical'); ELSE DBMS_OUTPUT.PUT_LINE('Both Files Are Different'); END IF; DBMS_LOB.FILECLOSEALL; END; / ======== 襦貅危 ======== 襦貅危磯 れ 一危螳 ル 豺襯 螳襴る 蟆朱 螳豌 貉殊 ル.. る狩 襦貅危磯ゼ 碁 譴 企 殊 覦讌襯 危危 蟆 譴.. LOB襯 れ 朱 覲旧 襦 襦貅危郁 焔 れ, 覲 朱覿 覈 一危螳 覲旧螻 ル.. 願 襷 り 蠏 豌 伎 襦 朱 覲旧讌 る, LOB 覈 一危襯 企襴蟆 蠍 覓語 譴...企 LOB襯 LOB 襦貅危一 伎 .. 襷 碁 BFILE 螻 る 襦貅危磯 訖 殊 蠏碁襦 給.. 企 LOB襯 企 豢螳 LOB 貉殊 一危襯 麹蟇磯 EMPTY_BLOB EMPTY_CLOB襯 襦貅危磯ゼ 燕伎 ..BFILE 企 豢螳 BFILENAME 貉殊 襦貅危磯 麹覃 .. 襷讌襷 覓語 企 LOB襷 蟆. るジ 螳 LOB 蠏狩讌 覈詩襦 豌襴 LOB襯 蠏碁 蟆 譬 螳.. ======================================= 企 LOB 蟷 DBMS_LOBれ 蠍 ======================================= or襦 螳ル一危 る ------------ ------------------ -------------------------------------------------------------------------------- COMPARE ALL LOB LOB襯 豌 朱襯 觜蟲 GETLENGTH ALL LOB LOB れ 蠍語企ゼ 覦. INSTR ALL LOB LOB 讌 覓語 ろ碁螻 殊 伎 谿城. READ ALL LOB 讌 襷 LOB襯 覯朱 曙 れ碁. BSUBSTR ALL LOB 朱誤一 伎 讌 豌 朱 LOB襯 覦. APPEND 企 LOB LOB襯 るジ LOB 豢螳 COPY 企 LOB LOB襯 るジ 朱 覲旧. EMPTY_BLOB BLOB BLOB 貉殊 襦貅危磯ゼ EMPTY_CLOB CLOB CLOB 貉殊 襦貅危磯ゼ EREASE 企 LOB 企 LOB 豌 朱襯 TRIM 企 LOB 讌 蠍語企 LOB襯 襯碁. WRITE 企 LOB LOB 一危襯 蠍磯. ==== ==== SQL> create table lobs( 2 lob_index integer, 3 clob_locator clob); 企 焔給. SQL> INSERT INTO LOBS VALUES(1,'Teach Yourself Oracle8i in 21 Days'); 1 螳 襷れ伎給. SQL> INSERT INTO LOBS VALUES(2,'Oracle Data Warehousing Unleashed'); 1 螳 襷れ伎給. SQL> INSERT INTO LOBS VALUES(3,'Teach Yourself Database Development With Oracle in 21 Days'); 1 螳 襷れ伎給. SQL> INSERT INTO LOBS VALUES(4,'Oracle Unleashed 2E'); 1 螳 襷れ伎給. SQL> INSERT INTO LOBS VALUES(5,EMPTY_CLOB()); 1 螳 襷れ伎給. SQL> INSERT INTO LOBS VALUES(6,EMPTY_CLOB()); 1 螳 襷れ伎給. SQL> select * from lobs; LOB_INDEX CLOB_LOCATOR ---------- ------------------------------------------------------------- 1 Teach Yourself Oracle8i in 21 Days 2 Oracle Data Warehousing Unleashed 3 Teach Yourself Database Development With Oracle in 21 Days 4 Oracle Unleashed 2E 5 6 6 螳 給. ======================================================== COPY 襦襯 伎 一危螳 覲旧 ======================================================== DECLARE Source_Lob CLOB; Dest_Lob CLOB; Copy_Amount INTEGER; BEGIN SELECT CLOB_LOCATOR into Dest_LOB FROM LOBS WHERE LOB_INDEX = 5 FOR UPDATE; -- FOR UPDATE locks the ROW SELECT CLOB_LOCATOR into Source_LOB FROM LOBS WHERE LOB_INDEX = 1; Copy_Amount := DBMS_LOB.GETLENGTH(Source_Lob); DBMS_LOB.COPY(Dest_LOB, Source_LOB,Copy_Amount); COMMIT; -- Start second copy process SELECT CLOB_LOCATOR into Dest_LOB FROM LOBS WHERE LOB_INDEX = 6 FOR UPDATE; SELECT CLOB_LOCATOR into Source_LOB FROM LOBS WHERE LOB_INDEX = 2; Copy_Amount := DBMS_LOB.GETLENGTH(Source_Lob); DBMS_LOB.COPY(Dest_LOB, Source_LOB,Copy_Amount); COMMIT; END; / SQL> SELECT * FROM LOBS; LOB_INDEX CLOB_LOCATOR ---------- ----------------------------------------------------------------------- 1 Teach Yourself Oracle8i in 21 Days 2 Oracle Data Warehousing Unleashed 3 Teach Yourself Database Development With Oracle in 21 Days 4 Oracle Unleashed 2E 5 Teach Yourself Oracle8i in 21 Days 6 Oracle Data Warehousing Unleashed 6 螳 給. 結覿 豈 ... 襯 覲願 磯狩企慨覃.....螳 襦襯 企至 蟆瑚 蟆.. Listing 14.7 Appending and Writing to LOBs DECLARE /* This appends the contents of Row 1 to the contents of Row 5. In addition, it writes text at the end of the values in Row 6. */ Source_Lob CLOB; Dest_Lob CLOB; Write_Amount INTEGER := 10; Writing_Position INTEGER ; Buffer VARCHAR2(10) := 'Added Text'; BEGIN -- Append from Row 1 to Row 5 SELECT CLOB_LOCATOR into Dest_LOB FROM LOBS WHERE LOB_INDEX = 5 FOR UPDATE; -- Locks Row for Update SELECT CLOB_LOCATOR into Source_LOB FROM LOBS WHERE LOB_INDEX = 1; DBMS_LOB.APPEND(Dest_LOB, Source_LOB); COMMIT; -- Write to a LOB SELECT CLOB_LOCATOR into Source_LOB FROM LOBS WHERE LOB_INDEX = 6 FOR UPDATE; -- Locks Row for Update Writing_Position := DBMS_LOB.GETLENGTH(Source_Lob) + 1; DBMS_LOB.WRITE(Source_LOB,Write_Amount,Writing_Position,Buffer); COMMIT; END; Listing 14.8 Extracting and Matching Data Inside CLOBs DECLARE /* This PL/SQL block finds patterns in a CLOB. It also extracts part of the data from a CLOB with SUBSTR */ Source_Lob CLOB; v_Pattern VARCHAR2(6) := 'Oracle'; v_Starting_Location INTEGER := 1; v_Nth_Occurrence INTEGER := 1; v_Position INTEGER ; v_Extract_Amount INTEGER; v_Buffer VARCHAR2(100) ; BEGIN -- Search for 1st Occurrence of Oracle in Row 5 SELECT CLOB_LOCATOR into Source_LOB FROM LOBS WHERE LOB_INDEX = 5; v_Position := DBMS_LOB.INSTR(Source_LOB,v_Pattern, v_Starting_Location,v_Nth_Occurrence); DBMS_OUTPUT.PUT_LINE('The first occurrence starts at position: ' || v_Position); -- Search for 2nd Occurrence of Oracle in Row 5 v_Nth_Occurrence := 2; SELECT CLOB_LOCATOR into Source_LOB FROM LOBS WHERE LOB_INDEX = 5; v_Position := DBMS_LOB.INSTR(Source_LOB,v_Pattern, v_Starting_Location,v_Nth_Occurrence); DBMS_OUTPUT.PUT_LINE('The second occurrence starts at position: ' || v_Position); -- Extract part of the data from a CLOB SELECT CLOB_LOCATOR into Source_LOB FROM LOBS WHERE LOB_INDEX = 6; v_Buffer := DBMS_LOB.SUBSTR(Source_LOB,11,v_Starting_Location); DBMS_OUTPUT.PUT_LINE('The substring extracted is: ' || v_Buffer); END; Listing 14.9 Reducing Data in CLOBs DECLARE /* This erases the data in Row 6, and trims the data in row 5 to one occurrence of the book title. */ Source_Lob CLOB; Erase_Amount INTEGER; Trim_Amount INTEGER; BEGIN -- Erase the data completely in Row 6 SELECT CLOB_LOCATOR into Source_LOB FROM LOBS WHERE LOB_INDEX = 6 FOR UPDATE; -- Locks Row for Update Erase_Amount :=DBMS_LOB.GETLENGTH(Source_LOB); DBMS_LOB.ERASE(Source_LOB,Erase_Amount,1); --Reduce Data in Row 5 to one instance of Book Title SELECT CLOB_LOCATOR into Source_LOB FROM LOBS WHERE LOB_INDEX = 5 FOR UPDATE; TRIM_AMOUNT := DBMS_LOB.GETLENGTH(Source_LOB) / 2; DBMS_LOB.TRIM(Source_LOB, TRIM_AMOUNT); COMMIT; END;