儲存過程建立表

2021-07-07 03:18:19 字數 1417 閱讀 3005

create or replace

procedure test1(   

tname       varchar2

)is   

v_createsql   varchar2(400);  

v_dropsql     varchar2(100);  

v_count       number(9);

begin    

v_createsql:='create table '||tname||'(   a  number(8) primary key, b varchar2(20))';   

v_dropsql:='drop table '||tname||' cascade constraints';                 

select count(*) into v_count from user_tables where table_name=upper('aaa');  

if v_count>0 then    

execute immediate v_dropsql;    

commit;   

end if;    

execute immediate v_createsql;   

commit;

end;

-------------------

oracle-儲存過程提示ora-01031: 許可權不足

使用者具有dba許可權,但在執行乙個儲存過程時提示「ora-01031: 許可權不足」,該過程中存在動態sql「execute immediate。。。」正是這裡報的錯誤。

1、oracle預設為定義者許可權,定義者許可權在儲存過程中role無效,需要顯示授權。

2、如果使用authid current_user關鍵字使用呼叫者許可權,則編譯時role無效,執行時有效。

解決辦法:

方法1:就這個儲存過程來說,create table想使用create any table許可權,而create any table許可權來自dba角色,預設情況下,雖然在會話環境中可見,但在儲存過程中不可見(無效)。

所以根據上面的第一條規則,可以顯示地將create any table許可權授予cog就可以了,即

grant create any table to cog;

方法2:採用呼叫者許可權,由於過程中使用動態sql,所以可以避開編譯時的檢查,但在執行時dba角色生效,即

create or replace procedure insert_data --插入user_客戶id,**表,客戶寬表

(rtn_id out number, --返回錯誤id

rtn_str out varchar --返回錯誤敘述

) authid current_user is

...................

Oracle 建立表,儲存過程

1.首先建立乙個customer 表 create table customer customerid varchar2 10 primary key,customername varchar2 20 custoemr varchar2 8 custoemrage int 2.插入四行資料 inse...

儲存過程建立多張表

delimiter create procedure score p begin declare i int declare table name varchar 20 declare table pre varchar 20 declare sql text varchar 2000 set i ...

oracle 儲存過程 建立表

需求 儲存過程完成一年建立乙個表實現 如下 create or replace procedure test123456 as suffix year varchar 5 tablename varchar 40 begin select to char sysdate,yyyy into suff...