将日期变量传递给 sql 动态语句

Passing date variable to sql dynamic statement

我有一个包,我需要多次执行类似的合并。这个包每天都执行,我每天都需要不同的数据(取决于一天)。所以我虽然创建了一个临时视图并在此视图上执行操作。由于似乎无法以静态方式在过程中创建视图,并且无法使用绑定变量,因此我尝试以这种方式进行:

PROCEDURE CREATE_VIEW( from_date DATE) IS
sqlCommand VARCHAR2(32000);
BEGIN
    sqlCommand :=
    'CREATE VIEW TMP_HELPER_VIEW AS 
    SELECT ID, IMPORT1_ID, IMPORT2_ID, PROD_ID
    FROM 
    (
        SELECT ID,
               IMPORT1_ID,
               -1,
               PROD_ID                
          FROM TABLE1
         WHERE     
            TS >= '||from_date||'
            AND TS < ADD_MONTHS('||from_date||', 1)
        UNION
        SELECT ID,
               -1,
               IMPORT2_ID,
               PROD_ID               
          FROM TABLE2
         WHERE     
            TS >= '||from_date||'
            AND TS < ADD_MONTHS('||from_date||', 1)';
    EXECUTE IMMEDIATE  sqlCommand;       
            
        

END CREATE_VIEW;

不过我要到这里 ORA-00907: missing right parenthesis 。 我认为我以错误的方式连接日期变量。谁能告诉我如何修复它?

非常感谢!

您可以做的是使用 DBMS_OUTPUT.PUT_LINE 转储确切的命令文本。你会看到你会有这样的东西:

 WHERE TS >= 08-DEC-20

这是因为日期没有引号,所以是您出错的原因。您实际上希望引用的日期看起来像这样:

 WHERE TS >= '08-DEC-20'

所以你的代码需要像

这样的东西
 WHERE TS >= '||chr(39)||from_date||chr(39)||'

使用 DATE 文字并命名列:

CREATE PROCEDURE CREATE_VIEW(
  from_date DATE
)
IS
BEGIN
  EXECUTE IMMEDIATE
    'CREATE OR REPLACE VIEW TMP_HELPER_VIEW (ID, IMPORT1_ID, IMPORT2_ID, PROD_ID) AS 
     SELECT ID, IMPORT1_ID, -1, PROD_ID                
     FROM TABLE1
     WHERE TS >= DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||'''
     AND   TS < ADD_MONTHS(DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||''', 1)
     UNION
     SELECT ID, -1, IMPORT2_ID, PROD_ID
     FROM TABLE2
     WHERE  TS >= DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||'''
     AND    TS < ADD_MONTHS(DATE '''||TO_CHAR(from_date, 'YYYY-MM-DD')||''', 1)';
END CREATE_VIEW;
/

或者,如果您想在时间中包含一个时间分量,则使用 TIMESTAMP 文字:

CREATE OR REPLACE PROCEDURE CREATE_VIEW(
  from_date DATE
)
IS
BEGIN
  EXECUTE IMMEDIATE
    'CREATE OR REPLACE VIEW TMP_HELPER_VIEW (ID, IMPORT1_ID, IMPORT2_ID, PROD_ID) AS 
     SELECT ID, IMPORT1_ID, -1, PROD_ID                
     FROM TABLE1
     WHERE TS >= TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||'''
     AND   TS < ADD_MONTHS(TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||''', 1)
     UNION
     SELECT ID, -1, IMPORT2_ID, PROD_ID
     FROM TABLE2
     WHERE  TS >= TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||'''
     AND    TS < ADD_MONTHS(TIMESTAMP '''||TO_CHAR(from_date, 'YYYY-MM-DD HH24:MI:SS')||''', 1)';
END CREATE_VIEW;
/