在存儲過程當中,執行了create table、update table、insert into tablejava
可是在使用pl/sql的存儲過程調試的時候,一有問題就直接卡住(標識:執行中.....)sql
後來爲了找了一下,緣由有二:oracle
一、使用execute immediate執行create table,須要對執行的用戶進行受權執行,命令以下:spa
二、使用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;