需要用到動態sql。1、首先要給使用者賦予許可權:
grant create any table to 使用者名稱;
2、建立儲存過程:
create procedure p_create_table
(v_sql varchar2)--輸入建表語句
asbegin
execute immediate v_sql;
end;
3、執行:
create就這個儲存過程來說,create table想使用create any table許可權,而create any table許可權來自dba角色,預設情況下,雖然在會話環境中可見,但在儲存過程中不可見(無效)。orreplace
procedure
createtable(tname
invarchar2)
issqltext varchar2(400);
v_createsql varchar2(400);
v_dropsql varchar2(100);
v_count number(9);
begin
sqltext := 'grant create any table to newsname'
; --newsname為資料庫使用者名稱,這裡需要給他建立表的許可權
execute
immediate sqltext;
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
(tname);
if v_count>0 then
execute
immediate v_dropsql;
commit
; end
if;
execute
immediate v_createsql;
commit
; end
;
所以根據上面的第一條規則,可以顯示地將create any table許可權授予cog就可以了,即grant create any table to cog;
在ORACLE儲存過程中建立臨時表
create procedure pro asstr varchar2 100 begin str create global temporary table tablename col1 varchar2 10 col2 number on mit preserve rows execute im...
在ORACLE儲存過程中建立臨時表
create procedure pro asstr varchar2 100 begin str create global temporary table tablename col1 varchar2 10 col2 number on commit preserve rows execute...
在ORACLE儲存過程中建立臨時表
在oracle儲存過程中建立臨時表 儲存過程裡不能直接使用ddl語句,所以只能使用動態sql語句來執行 on commit delete rows 說明臨時表是事務指定,每次提交後oracle將截斷表 刪除全部行 on commit preserve rows 說明臨時表是會話指定,當中斷會話時or...