现在有个很郁闷的问题,在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;
操作系统 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;
使用具有sysdba权限的用户登录,然后赋权
grant read,write on directory MYDIR12 to qzdata;
因为你操作了oracle中的外部表,
在使用外部表之前,首先要建立DIRECTORY对象。同时给需要进行外部表操作的用户赋予适当的权限。
ORA-01031: 权限不足
ORA-06512: 在 "SYSTEM.WRITETOPDBQZ", line 27
ORA-06512: 在 line 1
要学会问题定位。
可以在过程名后面加 authid current_user 解决。