SQL > show user
USER 为 "TEST "
SQL > CREATE TABLE test.AAA (
2 T_ID VARCHAR2 (5) NOT NULL,
3 T_IMAGE BLOB NOT NULL
4 );
表已创建。
SQL > create or replace directory images as 'D:/WORKS/DEMO/AA/IMAGES ';
目录已创建。
SQL > CREATE OR REPLACE PROCEDURE test.testp (
2 TID VARCHAR2,
3 FILENAME VARCHAR2) AS
4 F_LOB BFILE;
5 B_LOB BLOB;
6 BEGIN
7 INSERT INTO AAA (T_ID, T_IMAGE) VALUES (TID, EMPTY_BLOB ()) RETURN T_IMAGE INTO B_LOB;
8 F_LOB:= BFILENAME ( 'IMAGES ', FILENAME);
9 DBMS_LOB.FILEOPEN (F_LOB, DBMS_LOB.FILE_READONLY);
10 DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB, DBMS_LOB.GETLENGTH (F_LOB));
11 DBMS_LOB.FILECLOSE (F_LOB);
12 COMMIT;
13 END;
14 /
过程已创建。
SQL >
SQL > execute testp( 'F1001 ', 'AALOGO.GIF ');
PL/SQL 过程已成功完成。
http://www.oracle.com/technology/sample_code/tech/pl_sql/htdocs/x/Utl_File/start.htm
- UTL_FILE.FREMOVE 删除文件。
- UTL_FILE.FRENAME 重命名文件,事实上,还可以移动文件。
- UTL_FILE.FCOPY 将一个文件的全部或部分复制到另一个文件中。
- UTL_FILE.FGETATTR获取文件的长度之类的属性。
在Oracle9i第2版之前,当调用FOPEN打开文件(用于读或写)时,UTL_FILE要求必须明确指出文件的位置。这不是最优的实施,因为它意味着开发人员必须在应用程序中的多个地方对那些位置进行硬编码(hard-code)。如果目录改变了,就必须进行很多麻烦的整理工作。
你现在可以在Oracle9i第2版中为目录的文件系统位置指定一个Oracle目录对象的名字。这种技巧"隐藏"了实际的操作系统位置。如果那个位置需要改变,只需要更新目录对象的定义,所有对FOPEN,FREMOVE,FRENAME和FCOPY的调用都不会受到影响。
为了创建一个目录对象,需要具备CREATE ANY DIRECTORY权限,然后就可以像下面的例子那样定义一个新的目录对象:
CREATE OR REPLACE DIRECTORY DEVELOPMENT_ DIR as '/dev/source'; CREATE OR REPLACE DIRECTORY TEST_DIR as '/test/source';
你应当知道当你创建目录对象时,Oracle数据库并不会验证你所指定的位置。另一点需要留意的是当你在一个调用(如调用UTL_FILE.FOPEN)中指定目录对象的名字时,它被看作一个区分大小写的字符串。换而言之,如果你不是用大写