程如下:
(1)通过UTL_FILE.FOPEN方法找到对应路径,读取文件(文件一定要存在),并且给出读入规则。
(2)通过UTL_FILE.GET_LINE方法循环向变量中写入内容(UTL_FILE.PUT_LINE写入VARCHAR2类型数据,UTL_FILE.PUT_RAW方法是写入RAW类型的数据,一般来说RAW容量更大,用的更加广泛),这里由于逐行读取,所以要循环操作(报NO_DATA_FOUND异常,即没有数据后跳出循环)。
(3)将内容变量INSERT到指定库表内
(4)写入完成后,通过UTL_FILE.FCLOSE方法关闭文件,结束读入。
我们看一下具体操作,这里要创建一个存储过程SET_TEST_BLOB来演示该功能,具体看里面的注释。
CREATE OR REPLACE PROCEDURE SET_TEST_BLOB(I_FILENAME VARCHAR2,
I_ID VARCHAR2) IS
L_FILE UTL_FILE.FILE_TYPE;
L_BUFFER VARCHAR2(4000); --VARCHAR2最长4000,所以超过的话应该使用循环的方式或者用RAW,最长到32676
L_TEXT VARCHAR2(4000) := '';
BEGIN
L_FILE := UTL_FILE.FOPEN('BLOB_FILE_DIR', I_FILENAME, 'r'); --文件超过4000要使用循环或者RAW(最大32676)
DBMS_OUTPUT.PUT_LINE('===OPEN OK===' || I_FILENAME);
LOOP
BEGIN
UTL_FILE.GET_LINE(L_FILE, L_BUFFER); --读出文件,最大32676,循环读取,直到报NO_DATA_FOUND异常终止循环
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
END;
DBMS_OUTPUT.PUT_LINE('===IMPORT OK===' || L_BUFFER);
L_TEXT := L_TEXT || L_BUFFER;
DBMS_OUTPUT.PUT_LINE('===TEXT OK===' || L_TEXT);
END LOOP;
INSERT INTO TEST_BLOB F
(C_ID, C_NAME, C_TEXT)
VALUES
(I_ID, I_FILENAME, L_TEXT); --插入表
UTL_FILE.FCLOSE(L_FILE);
EXCEPTION
WHEN UTL_FILE.INVALID_PATH THEN
--无效的路径
DBMS_OUTPUT.PUT_LINE('===INVALID_PATH===' || I_ID);
RAISE;
WHEN UTL_FILE.INVALID_MODE THEN
--无效的打开模式
DBMS_OUTPUT.PUT_LINE('===INVALID_MODE===' || I_ID);
RAISE;
WHEN UTL_FILE.INVALID_OPERATION THEN
--无效的操作,文件打开错误会报这个异常,一般来说都是超长或打开方式byte型和非byte型
DBMS_OUTPUT.PUT_LINE('===INVALID_OPERATION===' || I_ID);
RAISE;
WHEN UTL_FILE.INVALID_MAXLINESIZE THEN
--无效的最大长度,VARCHAR2最大4000,RAW最大32676,超过回报这个异常,所以一般要进行循环操作
DBMS_OUTPUT.PUT_LINE('===INVALID_MAXLINESIZE===' || I_ID);
RAISE;
WHEN UTL_FILE.ACCESS_DENIED THEN
--拒绝进入指定路径,可能是授权问题
DBMS_OUTPUT.PUT_LINE('===ACCESS_DENIED===' || I_ID);
RAISE;
WHEN UTL_FILE.INVALID_FILEHANDLE THEN
--文件处理错误,不常见
DBMS_OUTPUT.PUT_LINE('===INVALID_FILEHANDLE===' || I_ID);
RAISE;
WHEN UTL_FILE.WRITE_ERROR THEN
--写入错误,处理该异常最好的方式是将要写入的文件简单化,然后找准错误原因
DBMS_OUTPUT.PUT_LINE('===WRITE_ERROR===' || I_ID);
RAISE;
WHEN NO_DATA_FOUND THEN
--SELECT时候未找到数据,不是UTL_FILE的异常
DBMS_OUTPUT.PUT_LINE('===NO_DATA_FOUND===' || I_ID);
UTL_FILE.FCLOSE(L_FILE);
RAISE;
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(L_FILE) THEN
UTL_FILE.FCLOSE(L_FILE);
RAISE;
END IF;
END SET_TEST_BLOB;
传入参数,调用该存储过程,注意执行后一定要提交,不然是不会真正插入的。
代码如下:
begin
-- Call the procedure
set_test_blob('set_test.txt','ST2');
end;
执行后会将文件内容存入表中,如下图:
点击进入ooppookid的博客