pl/sql 存儲過程執行execute immediate 卡住

 

在存儲過程當中,執行了create table、update table、insert into tablejava

可是在使用pl/sql的存儲過程調試的時候,一有問題就直接卡住(標識:執行中.....)sql

後來爲了找了一下,緣由有二:oracle

一、使用execute immediate執行create table,須要對執行的用戶進行受權執行,命令以下:spa

grant create table to  cusername;  

二、使用execute immediate執行insert/update時,建議表命名規範一下,不要使用oracle的關鍵詞(直接去度)去命名;調試

2.一、最好先在「SQL窗口」執行一下,看看是否OK;若是能夠,那就多是命名問題了。(僅供參考)code

 

CREATE OR REPLACE PROCEDURE PROC_A
-- auther:learcher

 as
  dobackday              date; --當前時間
  dobackdaystr           varchar2(20 CHAR); --當前時間字符串(yyyy-MM-dd hh24:mi:ss)
  first_day_by_month_str varchar2(20 CHAR); --月的第一天,執行建立表時間(yyyy-MM-dd)
  back_table_name        varchar2(32 CHAR); --備份的表名稱

  vs_sql varchar2(2048); -- 執行數據備份的sql

begin
  dobackday              := sysdate - 1; --備份昨天
  dobackdaystr           := to_char(dobackday, 'yyyy-MM-dd'); --當前時間字符串(yyyy-MM-dd hh24:mi:ss)
  first_day_by_month_str := to_char(trunc(dobackday, 'month'), 'yyyy-MM-dd'); --備份時間所在月的第一天
  back_table_name        := 'table_a' || to_char(trunc(dobackday, 'month'), 'yyyyMM');

  vs_sql := '';

  begin
    -- 當備份執行時間爲月的第一天,則進行月表建立
    -- 手動備份表語句
    -- create table table_a201712 as select s.* from table_a s where 1=2
    --if first_day_by_month_str=dobackdaystr then
    if 1 = 1 then
	  -- 受權grant create table to  cusername;  
      vs_sql := ' create table ' || back_table_name ||
                ' as select s.* from table_a s where 1=2 ';
      execute immediate vs_sql;
    end if;
  
    -- 使用佔位符,若是多個能夠直接加    -- execute immediate 'update table_a set CODE=:1,USER_NAME=:2' using 'code_id_001','user_name_str';
    execute immediate 'update table_a set CODE=:1' using 'code_id_001';
    commit;
  
    vs_sql := ' insert into ' || back_table_name || ' (
        CODE, USER_NAME
        )
     select            
         CODE, USER_NAME
     from table_a where 1=1 ';

    execute immediate vs_sql;
    commit;
  end;

end PROC_A;
相關文章
相關標籤/搜索