需求: 存儲過程完成一年創建一個表
實現代碼如下:
CREATE OR REPLACE
procedure TEST123456 AS
suffix_year VARCHAR(5);
TABLENAME VARCHAR(40);
BEGIN
SELECT TO_CHAR(SYSDATE,'yyyy') INTO suffix_year FROM DUAL;
TABLENAME:='TEST'||suffix_year;
DBMS_OUTPUT.put_line(suffix_year);
CREATE TABLE TABLENAME||'123' AS select * from TEST t WHERE 1=2;
-- EXCEPTION
-- WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('異常');
END;
上面的方法一直編譯不過去,因爲我的表名稱是一個變量,後來通過查閱各種資料瞭解到 可以用execute immediate 來實現!
新實現代碼如下:
CREATE OR REPLACE
procedure TEST123456 AS
suffix_year VARCHAR(5);
TABLENAME VARCHAR(40);
BEGIN
SELECT TO_CHAR(SYSDATE,'yyyy') INTO suffix_year FROM DUAL;
TABLENAME:='TEST'||suffix_year;
DBMS_OUTPUT.put_line(suffix_year);
--CREATE TABLE TABLENAME||'123' AS select * from ZP_SCAN_ORDER t WHERE 1=2;
execute immediate 'CREATE TABLE '||TABLENAME || ' AS select * from ZP_SCAN_ORDER t WHERE 1=2 ';
-- EXCEPTION
-- WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('異常');
END;
上面方法編譯算是成功了,但是在執行的時候發現 執行錯誤,提示是權限不足,然而我們把 execute immediate 'CREATE TABLE '||TABLENAME || ' AS select * from ZP_SCAN_ORDER t WHERE 1=2 ';
直接在plsql中執行是沒有問題的!
這個問題怎麼解決呢?
既然提示權限不足,那我就賦值權限給當前用戶user1,以sys用戶登錄 執行如下sql:
GRANT CREATE ANY TABLE TO user1
再次執行存儲過程,沒有問題,成功!