在存儲過程中,執行了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;
