以下过程失败,并且" ORA-0097:缺少等号错误"。
CREATE PROCEDURE AMEPSA.USP_ETL_BATCH_MASTER_UPDATE
(ENVIRONMENT in VARCHAR2, BATCH_STATUS in VARCHAR2, BATCH_USER_ID VARCHAR2, BATCH_JOB_NAME VARCHAR2)
AS
BEGIN
IF (BATCH_STATUS = 'Running') THEN
EXECUTE IMMEDIATE 'UPDATE AMEPSA.ETL_BATCH_MASTER SET
BATCH_STATUS_' || ENVIRONMENT || ' = ' || '''' || BATCH_STATUS || '''' || ',
BATCH_JOB_NAME_' || ENVIRONMENT || ' = ' || '''' || BATCH_JOB_NAME || '''' || ',' ||
'BATCH_USER_ID_' || ENVIRONMENT || ' = ' || '''' || BATCH_USER_ID || '''' || ',' ||
'BATCH_START_DATE_' || ENVIRONMENT || ' = TO_DATE(' || '''' || TO_CHAR(SYSDATE, 'MM/DD/YYYY HH24:MI:SS') || '''' || ', ' || '''' || 'MM/DD/YYYY HH24:MI:SS' || '''' || ') ' || ',' ||
'BATCH_END_DATE_' || ENVIRONMENT || ' = ' || 'NULL' || '
WHERE BATCH_NBR = (SELECT MAX(BATCH_NBR) FROM AMEPSA.ETL_BATCH_MASTER)';
ELSE
EXECUTE IMMEDIATE 'UPDATE AMEPSA.ETL_BATCH_MASTER SET
BATCH_STATUS_' || ENVIRONMENT || ' = ' || '''' || BATCH_STATUS || '''' || ',
BATCH_JOB_NAME_' || ENVIRONMENT || ' = ' || '''' || BATCH_JOB_NAME || '''' || ',' ||
'BATCH_END_DATE_' || ENVIRONMENT || ' = ' || 'TO_DATE(' || '''' || TO_CHAR(SYSDATE, 'MM/DD/YYYY HH24:MI:SS') || '''' || ', ' || '''' || 'MM/DD/YYYY HH24:MI:SS' || '''' || ')
WHERE BATCH_NBR = (SELECT MAX(BATCH_NBR) FROM AMEPSA.ETL_BATCH_MASTER)';
END IF;
COMMIT;
END;
GO
在调试问题时,我们用DBMS_OUTPUT.PUT_LINE语句替换了EXECUTE IMMEDIATE语句。执行此操作后,该过程返回一个成功执行的字符串(下面),没有语法错误。
UPDATE AMEPSA.ETL_BATCH_MASTER
SET BATCH_STATUS_STAGE = 'Running',
BATCH_JOB_NAME_STAGE = 'wf_TADM_Stage',
BATCH_END_DATE_STAGE = TO_DATE('08/14/2017 15:42:00', 'MM/DD/YYYY HH24:MI:SS')
WHERE BATCH_NBR = (SELECT MAX(BATCH_NBR) FROM AMEPSA.ETL_BATCH_MASTER)
当DBMS_OUTPUT.PUT_LINE语句返回的结果字符串在语法上是正确的时,为什么EXECUTE IMMEDIATE语句会认为它缺少等号?
Informatica完全例外:
严重性:错误时间戳:8/15/2017 9:46:10 AM节点:didre2007 主题:TRANSF_1_1_1进程ID:9072消息代码:CMN_1022消息: 数据库驱动程序错误... CMN_1022 [ORA-00927:缺少等号 ORA-06512:at" AMEPSA.USP_ETL_BATCH_MASTER_UPDATE",第14行ORA-06512: 在第2行
数据库驱动程序错误...函数名称:ExecuteSP
Oracle致命错误数据库驱动程序错误...函数名称:ExecuteSP
Oracle致命错误]
答案 0 :(得分:2)
看起来传递给过程的参数值有单引号;特别是第一个,但可能全部。您可以通过直接调用来复制:
exec USP_ETL_BATCH_MASTER_UPDATE('''STAGE''', '''Running''', '''someuser''', '''wf_TADM_Stage''');
得到
Error report -
ORA-00927: missing equal sign
ORA-06512: at "AMEPSA.USP_ETL_BATCH_MASTER_UPDATE", line 14
ORA-06512: at line 1
00927. 00000 - "missing equal sign"
或只是
exec USP_ETL_BATCH_MASTER_UPDATE('''STAGE''', 'Running', 'someuser', 'wf_TADM_Stage');
进入另一个分支并得到:
Error report -
ORA-00927: missing equal sign
ORA-06512: at "AMEPSA.USP_ETL_BATCH_MASTER_UPDATE", line 6
ORA-06512: at line 1
00927. 00000 - "missing equal sign"
通过调试显示代码执行之前,你可以看到它最终试图运行它:
UPDATE AMEPSA.ETL_BATCH_MASTER SET
BATCH_STATUS_'STAGE' = 'Running',
BATCH_JOB_NAME_'STAGE' = 'wf_TADM_Stage',BATCH_USER_ID_'STAGE' = 'someuser',BATCH_START_DATE_'STAGE' = TO_DATE('08/15/2017 19:37:00', 'MM/DD/YYYY HH24:MI:SS') ,BATCH_END_DATE_'STAGE' = NULL
WHERE BATCH_NBR = (SELECT MAX(BATCH_NBR) FROM AMEPSA.ETL_BATCH_MASTER)
报价不当; BATCH_STATUS_'STAGE'
构造正在抛出异常。
如果在没有这些额外单引号的情况下调用,那么您所显示的内容在任何一个分支中都有效。
因此,您需要了解为什么Informatica会添加这些单引号 - 可能只是开发人员对如何将字符串作为参数进行处理的混淆 - 并阻止它执行此操作。问题不在您展示的代码中,如果没有看到Informatica代码,我就不能更具体地说明它应该如何修复。
顺便提一下,在评论中提到您可以通过using
子句使用绑定变量,而不是将sysdate
转换为字符串并返回;它与您获得的错误无关,但可能如下:
CREATE PROCEDURE AMEPSA.USP_ETL_BATCH_MASTER_UPDATE
(ENVIRONMENT in VARCHAR2, BATCH_STATUS in VARCHAR2, BATCH_USER_ID VARCHAR2, BATCH_JOB_NAME VARCHAR2)
AS
BEGIN
IF (BATCH_STATUS = 'Running') THEN
EXECUTE IMMEDIATE 'UPDATE AMEPSA.ETL_BATCH_MASTER SET'
|| ' BATCH_STATUS_' || ENVIRONMENT || ' = :BATCH_STATUS,'
|| ' BATCH_JOB_NAME_' || ENVIRONMENT || ' = :BATCH_JOB_NAME,'
|| ' BATCH_USER_ID_' || ENVIRONMENT || ' = :BATCH_USER_ID,'
|| ' BATCH_START_DATE_' || ENVIRONMENT || ' = SYSDATE,'
|| ' BATCH_END_DATE_' || ENVIRONMENT || ' = NULL'
|| ' WHERE BATCH_NBR = (SELECT MAX(BATCH_NBR) FROM AMEPSA.ETL_BATCH_MASTER)'
USING BATCH_STATUS, BATCH_JOB_NAME, BATCH_USER_ID;
ELSE
EXECUTE IMMEDIATE 'UPDATE AMEPSA.ETL_BATCH_MASTER SET'
|| ' BATCH_STATUS_' || ENVIRONMENT || ' = :BATCH_STATUS,'
|| ' BATCH_JOB_NAME_' || ENVIRONMENT || ' = :BATCH_JOB_NAME,'
|| ' BATCH_END_DATE_' || ENVIRONMENT || ' = SYSDATE'
|| ' WHERE BATCH_NBR = (SELECT MAX(BATCH_NBR) FROM AMEPSA.ETL_BATCH_MASTER)'
USING BATCH_STATUS, BATCH_JOB_NAME;
END IF;
END;