【问题标题】:EXECUTE IMMEDIATE CREATE TABLE执行立即创建表
【发布时间】:2018-01-30 17:38:43
【问题描述】:

谁能帮我解决这个错误?我想立即执行一个创建表语句,该语句连接一个每天/每月都会更改的表名。

这是我的代码...

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

我已经搜索了很多关于这个的代码......但我没有看到任何人在创建表时将表名连接为变量。

我只是想知道这是否可能。我愿意接受任何建议。谢谢!

【问题讨论】:

  • 你能用你的确切代码更新问题吗
  • 检查您的报价。例如。 EXECUTE IMMEDIATE ''应该是EXECUTE IMMEDIATE '。你也不能在子查询中使用; (v_get_fromdate)
  • 这是准确的代码,我只是更改数据保护的值。谢谢
  • @Luis - 我会考虑不这样做 - 创建许多这样的表通常是一个糟糕的主意,而实际正确的解决方案是归档或分区

标签: sql database plsql concatenation execute-immediate


【解决方案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)';

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

【讨论】:

  • 抱歉...应该是 1 条引号,但我在这里放了 2 条引号。但这不是错误。谢谢。
  • 谢谢。我已经更新了代码,但仍然遇到同样的错误。
  • @Luis - 即使在 v_get_fromdate 中添加括号后?
【解决方案2】:

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

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;
/

【讨论】:

    猜你喜欢
    • 2018-02-25
    • 2018-02-27
    • 1970-01-01
    • 2015-03-04
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多