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返回的個數一樣...