oracle 存儲過程 創建表

需求: 存儲過程完成一年創建一個表

實現代碼如下:
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

再次執行存儲過程,沒有問題,成功!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章