现在有个很郁闷的问题,在ORACLE写了存储过程,存储过程名为writetopdbqz,在操作系统版本为winxp,用户名为qzdata 调用存储过程没问题,可是在win2003操作系统版本用户名为qzdata下运行,提示权限不足,然后我在system用户下执行存储过程却提示该表或视图不存在,给相关的表名前加了一个用户名,最后提示权限不足,我很纳闷,ORACLE为啥会出现这样的麻烦事?所安装的ORACLE版本和配置一模一样,如何在qzdata下顺利执行此存储过程?请教高手,谢谢。
操作系统 WIN2003在SYSTEM用户执行存储过程如下:
exec WRITETOPDBQZ('QZDATA.QZ_351_DYS_01','2010-03-01','1','1003','1','1',1,1,1) begin WRITETOPDBQZ('QZDATA.QZ_351_DYS_01','2010-03-01','1','1003','1','1',1,1,1); end;
 
  ORA-01031: 权限不足
   ORA-06512: 在 "SYSTEM.WRITETOPDBQZ", line 27
   ORA-06512: 在 line 2
在qzdata过程执行过程出错提示如下:
   begin WRITETOPDBQZ('QZ_351_DYS_01','2010-03-01','1','1003','1','1',1,1,1); end;   ORA-01031: 权限不足
   ORA-06512: 在 "QZDATA.WRITETOPDBQZ", line 1
   ORA-06512: 在 line 2
 
存储过程相关代码如下:
CREATE OR REPLACE PROCEDURE writetopdbqz
(tablename VARCHAR2,jwdatetime VARCHAR2,stationnumber VARCHAR2,itemid VARCHAR2,pointnumber VARCHAR2,SRate VARCHAR2,obsvaluefile NUMBER,pflag NUMBER,dt NUMBER )
IS
BEGIN
 Declare  
  src_clob   BFILE;
   dest_clob   CLOB;
    dst_offset  number := 1 ;
    src_offset  number := 1 ;
     lang_ctx    number;
     bstr_sql varchar2(255);
 warning     number;
  Begin
       IF obsvaluefile = 1 THEN
          src_clob := BFILENAME('MYDIR12', 'jwv1.txt');
       ELSIF obsvaluefile = 2 THEN
           src_clob := BFILENAME('MYDIR12', 'jwv2.txt');
       ELSIF obsvaluefile = 3 THEN
         src_clob := BFILENAME('MYDIR12', 'jwv3.txt');
        ELSIF obsvaluefile = 4 THEN
         src_clob := BFILENAME('MYDIR12', 'jwv4.txt');
        END IF;
         lang_ctx  := DBMS_LOB.DEFAULT_LANG_CTX;
   bstr_sql:=' INSERT INTO '||tablename||'(Startdate,stationid,pointid,itemid,samplerate,obsvalue,processingflag,date_index) VALUES(:1,:2,:3,:4,:5,:6,:7,:8) returning obsvalue into :9';
   EXECUTE IMMEDIATE  bstr_sql  using to_date(jwdatetime,'YYYY-MM-DD'),stationnumber,pointnumber,itemid,SRate,empty_clob(),pflag,dt returning into dest_clob;    dst_offset  := 1 ;
    src_offset   := 1;  DBMS_LOB.OPEN(src_clob, DBMS_LOB.LOB_READONLY);
   DBMS_LOB.LoadCLOBFromFile(
          DEST_LOB     => dest_clob
        , SRC_BFILE    => src_clob
        , AMOUNT       => DBMS_LOB.GETLENGTH(src_clob)
        , DEST_OFFSET  => dst_offset
        , SRC_OFFSET   => dst_offset
        , BFILE_CSID   => DBMS_LOB.DEFAULT_CSID
        , LANG_CONTEXT => lang_ctx
        , WARNING      => warning
    );  DBMS_LOB.CLOSE(src_clob);
 
  End;
  COMMIT;
  END;

解决方案 »

  1.   

    MYDIR12这个目录对象,qzdata没有权限吧,试试
    使用具有sysdba权限的用户登录,然后赋权
    grant read,write on directory MYDIR12 to qzdata;
      

  2.   

    多谢楼上解答,可我用sysdba身份分配权限,用上述命令时,SQLPLUS提示:2,这是为什么呢?权限没有分配成功?
      

  3.   

    多谢楼上解答,可我用sysdba身份分配权限,用上述命令时,SQLPLUS提示:2,这是为什么呢?权限没有分配成功?
      

  4.   

    grant read on directory MYDIR12 to qzdata;是不是漏掉了最后的分号?2是因为没有分号,SQLPLUS以为你要继续输入命令。跟上分号(英文输入法下的),然后按回车键
      

  5.   

    应该是权限没有分配成功。windows2003作为专用服务器操作系统,有很多权限设置和诸多限制。LZ遇到此问题不足为奇,
    因为你操作了oracle中的外部表,
    在使用外部表之前,首先要建立DIRECTORY对象。同时给需要进行外部表操作的用户赋予适当的权限。 
      

  6.   

    多谢楼上解答,已按上述命令分配权限了,依然出错,提示:
    ORA-01031: 权限不足
    ORA-06512: 在 "SYSTEM.WRITETOPDBQZ", line 27
    ORA-06512: 在 line 1
      

  7.   

    执行这个存储过程是在Administrator用户下执行,应该不会出现文件访问权限的问题吧? 我要访问的文件是在C盘根目录下.
      

  8.   

    在sqlplus 中测试啊,权限问题很容易定位的。先定位是哪一行代码导致的,贴出来不就解决了。
    要学会问题定位。
      

  9.   

    在存储过程中的role是无效的,,所以你的用户即便是有权限的role也是白搭。。
    可以在过程名后面加 authid current_user 解决。