调用存储过程报错 ORA-01031

       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
is
  v_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;
/

你可能感兴趣的:(sql,Date,user,table,存储,insert)