存完后,表中 fname(BFILE)这项的数值竟是 <VALUE ERROR>,.这是正常的数值吗?
具体的:(大家看看我错在那里。在客户端使用PL\SQL)
1、 create or replace directory ding_dir  as   'd:\mytry';  ——在我电脑D盘新建文件夹mytry,存放1.jpg 
2、 create   table   ding_bfiletest(ID number(8),fname blob);
  
    create   table   ding_BLOBTEST(ID number(8),blobname blob);
3、 INSERT INTO ding_bfiletest VALUES (1, BFILENAME ('ding_dir', '1.jpg')); 
4、读取bfile ,我编了个过程ding_bfile_blob_test
    create or replace procedure ding_bfile_blob_test(tid in number, filename in varchar2, filedir in varchar2,upmessage out varchar2) is
blob_loc  BLOB; 
bfile_loc BFILE;
begin
  INSERT INTO ding_BLOBTEST(ID,blobname) VALUES(TID,EMPTY_BLOB()) RETURN blobname INTO blob_LOC;  
  bfile_loc := BFILENAME(filedir,filename);        
   /* 假如bfile文件实际存在 */  
     IF (DBMS_LOB.FILEEXISTS(bfile_loc) != 0)    THEN    
         /* 打开bfile源文件 */        
          DBMS_LOB.OPEN(bfile_loc, DBMS_LOB.LOB_READONLY);     
             /* 打开目标blob: */       
            DBMS_LOB.OPEN(blob_loc, DBMS_LOB.LOB_READWRITE);    
                /*从文件中装入 */      
            DBMS_LOB.LOADFROMFILE(blob_loc, bfile_loc,DBMS_LOB.GETLENGTH(bfile_loc));    
          /* 记得关闭: */       
         DBMS_LOB.CLOSE(blob_loc);       
         DBMS_LOB.CLOSE(bfile_loc);        
         COMMIT;      
          upmessage := '0';   
           END IF;    
          EXCEPTION  WHEN OTHERS THEN         ROLLBACK;         
           upmessage := '操作失败';  
end ding_bfile_blob_test;
我要问的两点:   ①执行3后,查看ding_bfiletest,表中 fname(BFILE)这项的数值竟是 <VALUE ERROR>,.这是正常的数值吗?   ②测试函数过程,总显示'操作失败'?
为什么呢?为什么呢?
为什么呢?
为什么呢?
为什么呢?

解决方案 »

  1.   

    注意要大写INSERT INTO ding_bfiletest VALUES (1, BFILENAME ('DING_DIR', '1.jpg')); 
      

  2.   


    出现<VALUE ERROR>肯定是出错了!!--你出错的原因有两点:
    1.directory的引用要使用大写的.
    2.文件的引用要带'\',否则directory+filename就会缺少'\'
    --下面的测试在10g成功:
    create or replace directory ding_dir  as  'd:\mytry';  
    --/*在我电脑D盘新建文件夹mytry,存放1.jpg */
    create  table  ding_bfiletest(ID number(8),fname BFILE);
    create  table  ding_BLOBTEST(ID number(8),blobname blob); 
    SELECT * FROM ding_BLOBTEST;
    INSERT INTO ding_bfiletest VALUES (2, BFILENAME ('DING_DIR', '1.jpg')); 
    SELECT * FROM ding_bfiletest; 
    --输出:
    ID FNAME
    1  <BFILE>--********
    CREATE OR REPLACE PROCEDURE DING_BFILE_BLOB_TEST(TID       IN NUMBER,
                                                     FILENAME  IN VARCHAR2,
                                                     FILEDIR   IN VARCHAR2,
                                                     UPMESSAGE OUT VARCHAR2) IS
      BLOB_LOC  BLOB;
      BFILE_LOC BFILE;
    BEGIN
      INSERT INTO DING_BLOBTEST
        (ID, BLOBNAME)
      VALUES
        (TID, EMPTY_BLOB()) RETURN BLOBNAME INTO BLOB_LOC;
      BFILE_LOC := BFILENAME(FILEDIR, FILENAME);
      
      /* 假如bfile文件实际存在 */
      IF (DBMS_LOB.FILEEXISTS(BFILE_LOC) != 0) THEN
        /* 打开bfile源文件 */
        DBMS_LOB.OPEN(BFILE_LOC, DBMS_LOB.LOB_READONLY);
        /* 打开目标blob: */
        DBMS_LOB.OPEN(BLOB_LOC, DBMS_LOB.LOB_READWRITE);
        /*从文件中装入 */
        DBMS_LOB.LOADFROMFILE(BLOB_LOC,
                              BFILE_LOC,
                              DBMS_LOB.GETLENGTH(BFILE_LOC));
        /* 记得关闭: */
        DBMS_LOB.CLOSE(BLOB_LOC);
        DBMS_LOB.CLOSE(BFILE_LOC);
        COMMIT;
        UPMESSAGE := '0';
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        ROLLBACK;
        UPMESSAGE := '操作失败';
    END DING_BFILE_BLOB_TEST;
    /DECLARE
     v_o VARCHAR2(2000);
    BEGIN
    DING_BFILE_BLOB_TEST(1,'\'||'1.jpg','DING_DIR',v_o);
    dbms_output.put_line(v_o);
    END;
    /SELECT * FROM DING_BLOBTEST; 
    --输出:
    ID BLOBNAME
    1   <BLOB>
      

  3.   

    完全安到楼上的意见,修改的,结果仍然是存完后,表中 fname(BFILE)这项的数值是 <VALUE ERROR>,
    注:
    PLSQL Developer 7.0.1.1066.exe
    ora9i
    本机没有安装Oracle数据库,通过客户端PL/SQL访问数据库的
      

  4.   

    /DECLARE
     v_o VARCHAR2(2000);
    BEGIN
    DING_BFILE_BLOB_TEST(1,'\'||'1.jpg','DING_DIR',v_o);
    dbms_output.put_line(v_o);
    END;
    /
    ///
    /DECLARE
     v_o VARCHAR2(2000);
    BEGIN
    DING_BFILE_BLOB_TEST(1,'1.jpg','DING_DIR',v_o);
    dbms_output.put_line(v_o);
    END;
    /
    ///
    我把这两个放入test window里面测试,都没有提示错误〉??
    但我点击Procedures-->DING_BFILE_BLOB_TEST右键-->test
    在filename里面输入参数 1.jpg,就提示“操作错误”
    在filename里面输入参数 \1.jpg,就没有提示错误。
      

  5.   

    不知LZ问题解决了没。从LZ说的这句话“本机没有安装Oracle数据库,通过客户端PL/SQL访问数据库的”可以看出,LZ的SQL命令式在客户机发的,而LZ所说的路径'd:\mytry'和'1.jpg'也是指客户机的路径和文件。我试验发现,在客户机操作出现同样的问题。如果'd:\mytry'和'1.jpg'是在服务器里,而SQL命令式在客户机发的,则LZ的代码的可行。