pl/sql 存储过程执行execute immediate 卡住
在存储过程中,执行了create table、update table、insert into table
但是在使用pl/sql的存储过程调试的时候,一有问题就直接卡住(标识:执行中.....)
后来为了找了一下,原因有二:
1、使用execute immediate执行create table,需要对执行的用户进行授权执行,命令如下:
grant create table to cusername;
2、使用execute immediate执行insert/update时,建议表命名规范一下,不要使用oracle的关键词(直接去度)去命名;
2.1、最好先在“SQL窗口”执行一下,看看是否OK;如果可以,那就可能是命名问题了。(仅供参考)
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;