呼叫儲存過程報錯 ORA 01031

2021-06-08 14:17:00 字數 2136 閱讀 1622

a使用者呼叫b使用者的儲存過程,如果儲存過程中有動態建表的sql語句,如create table test,那麼管理員(如dba)必須給b使用者賦予create table的許可權,即使b已經是dba角色也必須單獨授予建表的許可權;如果是create table a.test,則必須給b使用者授予create any table的許可權,這樣a呼叫b的儲存過程時,才能在a下面建立表test,否則以上呼叫均報許可權不足的錯誤ora-01031。

--實驗環境(以下語句均在sqlplus下執行):

set  serveroutput on

create user a identified by a;

grant dba to a;

create user b identified by b;

grant dba to b;

create table b.tab_src as select * from dual;

create or replace function b.hastable(tablename varchar2)

return boolean

isv_n  number;

cursor c1 is select table_name from user_all_tables;

v_tab varchar2(20);

begin

open c1;

loop

fetch c1 into v_tab;

exit when c1%notfound or c1%notfound is null;

dbms_output.put_line(v_tab);

end loop;

close c1;

select  count(*)

into   v_n

from  user_all_tables where table_name=upper(tablename);

return   v_n>0;

end;

/create or replace procedure b.zc(src_table_id in varchar2,desc_table_id in varchar2,user_id in varchar2) as

sql_temp varchar2(2000);

begin

if hastable(desc_table_id) then

sql_temp:= 'insert into '||desc_table_id||q'[ select t.*,']'||user_id||q'[' as user_id,to_timestamp(to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff'),'yyyy-mm-dd hh24:mi:ssxff') as insert_date from ]'||src_table_id||' t';

else

sql_temp:= 'create table  '||desc_table_id||q'[ as select t.*,']'||user_id||q'[' as user_id,to_timestamp(to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff'),'yyyy-mm-dd hh24:mi:ssxff')  as insert_date from ]'||src_table_id||' t';

end if;

dbms_output.put_line(sql_temp);

execute immediate sql_temp;

sql_temp := 'create  table a.test(id number)';

dbms_output.put_line(sql_temp);

execute immediate sql_temp;   

commit;

end zc;

/ declare    

tabname  varchar2(20) := 'tab_src';

mbtab    varchar2(20)  := 'test333';

userid   varchar2(20)  := '99999afda';

begin

b.zc(tabname,mbtab,userid);

end;

/

過程執行報錯ORA 4068

今天在執行乙個過程是報了乙個ora 4068錯誤。雖然問題很簡單,而且也很容易解決,但是要真正理解的錯誤產生的原因,還需要對概念理解的比較清晰。下面做乙個簡單的例子重現錯誤 sql create table t as select from tab 表已建立。sql create or replac...

PHP呼叫MYSQL儲存過程 不報錯的解決方法

前兩天跟同事一起開發一套庫存管理系統,我負責寫頁面程式,同事負責寫儲存過程,寫程式時一切進展很順利,直到開發完成,我用php呼叫他的儲存過程時問題發生了。以後開發時需要注意以下幾點 1 連線mysql資料庫時要注意後兩個引數 define client multi results 131072 定義...

Oracle儲存過程呼叫儲存過程

oracle儲存過程呼叫有返回結果集的儲存過程一般用光標的方式,宣告乙個游標,把結果集放到游標裡面,然後迴圈游標 declare newcs sys refcursor cs1 number cs2 number cstype table rowtype table列的個數和newcs返回的個數一樣...