我正在尝试创建一个动态表,其中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');
答案 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你的引号,因为你的查询是一个要解析的字符串。