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...