使用要在create语句中传递的变量执行immediate

时间:2016-06-27 08:26:35

标签: oracle plsql

我正在尝试创建一个动态表,其中proc_date(这是一个日期字段)应该是变量run的值

delete from bo_right WHERE name ='name2' AND name = 'name3';

但是低于错误:

  

CREATE OR REPLACE PROCEDURE dummy(lv_proc_dt VARCHAR2) AS select_s VARCHAR2(30000); v_sysdate VARCHAR2(10) := to_char(to_date('MAY-2016', 'MON-YYYY'), 'mONyy'); BEGIN select_s := 'CREATE TABLE msi_fund_thrshld_acct_BD_' || v_sysdate || ' AS select * from msi_funding_threshold_account2 where proc_dt=TRUNC(LAST_DAY(TO_DATE(TO_CHAR('01 - '||LV_PROC_DT ),' dd - mon - yyyy ')))'; EXECUTE IMMEDIATE select_s; END; exec dummy('MAY-2016');

2 个答案:

答案 0 :(得分:1)

CREATE OR REPLACE PROCEDURE DUMMY(LV_PROC_DT VARCHAR2) AS

  select_s VARCHAR2(30000); 
  v_sysdate VARCHAR2(10) := to_char(to_date('MAY-2016', 'MON-YYYY'),'mONyy');

BEGIN
  SELECT_S := 'CREATE TABLE msi_fund_thrshld_acct_BD_'||V_SYSDATE
            ||  ' AS select * from msi_funding_threshold_account2 where proc_dt=TRUNC(LAST_DAY(TO_DATE(TO_CHAR(''01-''||LV_PROC_DT ),''DD-MON-YYYY'')))'; 
  EXECUTE IMMEDIATE select_s;
END;

可以从sqlplus

以这种方式调用
EXEC DUMMY('MAY-2016');

答案 1 :(得分:1)

问题在于换行。 Oracle不会理解您的换行符,因此您需要将它或concatenate小字符串一起删除:

-- [...]

BEGIN

  select_s := 'CREATE TABLE msi_fund_thrshld_acct_BD_' || v_sysdate ||
              ' AS select *  from msi_funding_threshold_account2 where proc_dt=TRUNC(LAST_DAY(TO_DATE(TO_CHAR(' ||
              '''01 - ''||LV_PROC_DT ),'' dd - mon - yyyy '')))';
  EXECUTE IMMEDIATE select_s;
END;

  select_s := 'CREATE TABLE msi_fund_thrshld_acct_BD_' || v_sysdate ||
              ' AS select *  from msi_funding_threshold_account2 where proc_dt=TRUNC(LAST_DAY(TO_DATE(TO_CHAR(''01 - ''||LV_PROC_DT ),'' dd - mon - yyyy '')))';

还添加了双引号'',正如@ Praneeth的回答所指出的那样:你需要escape你的引号,因为你的查询是一个要解析的字符串。