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;
相关文章
相关标签/搜索