在oracle存儲過程中,默認是可以直接執行DML和DQL的,但是執行create 或者 drop 這種的DDL則需要藉助EXECUTE IMMEDIATE ···
如下備份表語句
--按年備份
SELECT TO_CHAR(SYSDATE, 'YYYY') INTO V_N FROM DUAL;
V_CREATESQL := 'CREATE TABLE TEXT_' || V_N ||
'_T AS SELECT * FROM TEXT';
EXECUTE IMMEDIATE V_CREATESQL;
當執行該語句時,提示ORA-01031: 權限不足 。該用戶已賦予DBA權限。
原因:CREATE TABLE想使用CREATE ANY TABLE權限,而CREATE ANY TABLE權限來自DBA角色,默認情況下,雖然在會話環境中可見,但在存儲過程中不可見(無效)。
即:ORACLE默認爲定義者權限,定義者權限在存儲過程中ROLE無效,需要顯式授權。
grant CREATE TABLE to [username];