2017-08-22 61 views
0

任何人都可以帮我解决这个错误吗?我想要立即执行Create Table语句,该语句连接将每天/每月更改的表名。EXECUTE IMMEDIATE CREATE TABLE

这是我的代码...

DECLARE 
    v_table_name VARCHAR2(100); 
    v_get_fromdate VARCHAR2(200); 
BEGIN 
    v_table_name := 'mpiat_after_bs_' || SUBSTR(TO_CHAR(SYSDATE, 'ddmonyy'), 3, 5) || '_t'; 
    v_get_fromdate := 'select GET_FROMDATE(to_date(''01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2 
    ) ||'/2017 00:00:00'',''dd/mm/yyyy hh24:mi:ss''),''R'') from dual;'; 
    EXECUTE IMMEDIATE '' 

    CREATE TABLE ' || v_table_name || ' AS 
    SELECT column1 , 
     column2 , 
     column3 , 
     column4 , 
     column5 
    FROM table_name 
    WHERE column1 >=' || v_get_fromdate ||' 
    AND column3 LIKE ''tbl_%''';  
END; 

这是我得到我已经搜查这方面有很多的代码错误...

Error report - 
ORA-00936: missing expression 
ORA-06512: at line 7 
00936. 00000 - "missing expression" 
*Cause:  
*Action: 


Line 7 is EXECUTE IMMEDIATE 'CREATE TABLE ' || v_table_name || ' AS SELECT column1 

。 ..但我没有看到任何人在创建表时将表名作为变量连接起来。

我只想知道这是否可能。我愿意为此提供任何建议。谢谢!

+0

您是否可以用您的确切代码更新问题 –

+1

检查您的报价。例如。 '执行立即'''应该'执行立即''。您也不能在子查询中使用';'(v_get_fromdate) – daZza

+0

这是确切的代码,我只是更改数据保护的值。谢谢 – Luis

回答

1

线 -

EXECUTE IMMEDIATE '' 

你只需要1个报价,而不是2报价

将其更改为

EXECUTE IMMEDIATE ' 

线

v_get_fromdate := 'select GET_FROMDATE(to_date(''01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2 
) ||'/2017 00:00:00'',''dd/mm/yyyy hh24:mi:ss''),''R'') from dual;'; 

,应该是

v_get_fromdate := '(select GET_FROMDATE(to_date(''01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2 
) ||'/2017 00:00:00'',''dd/mm/yyyy hh24:mi:ss''),''R'') from dual)'; 

分号不能在子查询中使用。

+0

我的歉意......应该是1的引号,但我已经放在这里2引号。但这不是错误。谢谢。 – Luis

+0

谢谢。我已经更新了代码,但仍然有相同的错误。 – Luis

+0

@Luis - 即使在'v_get_fromdate'中添加括号后? –

0

根据您的代码,我们不需要SELECT语句从oracle函数中获取值。我们应尽可能避免动态查询。希望下面的代码片段有所帮助。

DECLARE 
    v_table_name VARCHAR2(100); 
    v_get_fromdate VARCHAR2(200); 
BEGIN 
    v_table_name := 'mpiat_after_bs_' || SUBSTR(TO_CHAR(SYSDATE, 'ddmonyy'), 3, 5) || '_t'; 
    V_GET_FROMDATE := GET_FROMDATE(TO_DATE('01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2) ||'/2017 00:00:00','dd/mm/yyyy hh24:mi:ss'),'R'); 
    EXECUTE IMMEDIATE '  
     CREATE TABLE ' || v_table_name || ' AS  
     SELECT column1 ,   
     column2 ,   
     column3 ,   
     column4 ,   
     column5  
     FROM table_name  
     WHERE column1 >=' || v_get_fromdate ||'  
     AND column3 LIKE ''tbl_%'''; 
END; 
/