oracle程序错误PLS-00103遇到符号“END”[关闭]
Posted
技术标签:
【中文标题】oracle程序错误PLS-00103遇到符号“END”[关闭]【英文标题】:oracle procedure error PLS-00103 Encountered the symbol "END" [closed] 【发布时间】:2013-12-04 13:03:32 【问题描述】:我收到以下错误:
58/6 PLS-00103:在期待其中之一时遇到符号“END” 以下:
开始函数pragma过程子类型类型 当前光标删除 之前存在
有人知道我错过了什么吗?
CREATE OR REPLACE PROCEDURE VALIDATE_BI_JOB_COMPLETE_PROC AS
msg SYS.XMLTYPE;
msg_props DBMS_AQ.MESSAGE_PROPERTIES_T;
msg_id RAW(16);
queue_options DBMS_AQ.ENQUEUE_OPTIONS_T;
rec_count INTEGER;
/******************************************************************************
NAME: VALIDATE_BI_JOB_COMPLETE_PROC
*******************************************************************************
BEGIN
INSERT INTO JOB_LOG
(JOB_NAME, JOB_SEQUENCE, RUN_DATE, LINE_SEQ_NO, LOG_TXT)
VALUES
($$PLSQL_UNIT, 1, SYSDATE, 1, 'Job Started at ' || to_char(sysdate, 'MM/DD/YYYY HH:MI:SS'));
COMMIT;
rec_count := 0;
SELECT COUNT(*) INTO rec_count
FROM SCHEDULED_JOBS
WHERE JOB_NAME IN ('bi_get_transactional_data', 'bi_get_reference_data') AND
CURRENTLY_PROCESSING_FLG = 'Y';
IF rec_count > 0 THEN
BEGIN
DECLARE CURSOR email IS
SELECT EMAIL_ID
FROM ERROR_EMAIL_NOTIFICATION
WHERE ACTIVE = 'Y' AND
SEVERITY_CD = 'ERROR';
vFROM VARCHAR2(30) := 'WORK_SYSTEM@XXX.COM';
vTYPE VARCHAR2(30) := 'text/plain; charset=us-ascii';
msg_body VARCHAR2(4000) := 'BI jobs are still running, please investigate.
bi_get_transactional_data, bi_get_reference_data)';
crlf CONSTANT VARCHAR2(2):= CHR(13) || CHR(10);
FOR email_rec IN email
LOOP
utl_mail.send(vFROM, email_rec.EMAIL_ID, NULL, NULL, ora_database_name || ': ' ,
msg_body, vTYPE, NULL);
END LOOP;
END;
END IF;
INSERT INTO JOB_LOG
(JOB_NAME, JOB_SEQUENCE, RUN_DATE, LINE_SEQ_NO, LOG_TXT)
VALUES
($$PLSQL_UNIT, 2, SYSDATE, 1, 'Job Ended at ' || to_char(sysdate, 'MM/DD/YYYY HH:MI:SS') ||
'. Records sent to JSSO: ' || rec_processed);
COMMIT;
-- exception processing goes here
EXCEPTION
WHEN OTHERS THEN
LOG_ERROR(
p_APP_ID => 'ORACLE',
p_SEVERITY_CD => 'ERROR',
p_ROUTINE_NAME => $$PLSQL_UNIT,
p_BACKTRACE => DBMS_UTILITY.FORMAT_ERROR_BACKTRACE,
p_SQL_CODE => SQLCODE,
p_LOG_TXT => SQLERRM,
p_HOST_ID => SYS_CONTEXT('userenv', 'host'),
p_USER_ID => SYS_CONTEXT('userenv', 'session_user'),
p_SESSION_ID => SYS_CONTEXT('userenv', 'sid'));
INSERT INTO JOB_LOG
(JOB_NAME, JOB_SEQUENCE, RUN_DATE, LINE_SEQ_NO, LOG_TXT)
VALUES
($$PLSQL_UNIT, 2, SYSDATE, 1, 'Job ABENDED at ' || to_char(sysdate, 'MM/DD/YYYY
HH:MI:SS') || '. Error condtion.');
COMMIT;
END;
/
【问题讨论】:
您的大部分程序都被注释掉了...您没有似乎有一个 BEGIN... 对不起,我发布此错误。实际注释在星号行之后结束。我不确定有两个存在陈述是否有效。这可能是我的问题吗? Alen - 感谢您的回答,实际上我之前尝试过。问题是当我做出您建议的更改时,无法识别此之后的 INSERT INTO JOB_LOG 语句。 70/1 PL/SQL:忽略 SQL 语句 73/148 PL/SQL:ORA-00984:此处不允许列 【参考方案1】:您必须将BEGIN
从第 28 行移到第 41 行。而不是这样:
IF rec_count > 0 THEN
BEGIN <----------------------------------------- THIS IS WRONG
DECLARE CURSOR email IS
SELECT EMAIL_ID
FROM ERROR_EMAIL_NOTIFICATION
WHERE ACTIVE = 'Y' AND
SEVERITY_CD = 'ERROR';
vFROM VARCHAR2(30) := 'WORK_SYSTEM@XXX.COM';
vTYPE VARCHAR2(30) := 'text/plain; charset=us-ascii';
msg_body VARCHAR2(4000) := 'BI jobs are still running, please investigate.
bi_get_transactional_data, bi_get_reference_data)';
crlf CONSTANT VARCHAR2(2):= CHR(13) || CHR(10);
FOR email_rec IN email
LOOP
这样写:
IF rec_count > 0 THEN
DECLARE CURSOR email IS
SELECT EMAIL_ID
FROM ERROR_EMAIL_NOTIFICATION
WHERE ACTIVE = 'Y' AND
SEVERITY_CD = 'ERROR';
vFROM VARCHAR2(30) := 'WORK_SYSTEM@XXX.COM';
vTYPE VARCHAR2(30) := 'text/plain; charset=us-ascii';
msg_body VARCHAR2(4000) := 'BI jobs are still running, please investigate.
bi_get_transactional_data, bi_get_reference_data)';
crlf CONSTANT VARCHAR2(2):= CHR(13) || CHR(10);
BEGIN <-------------------------------------------- THIS IS OK
FOR email_rec IN email
LOOP
【讨论】:
这个答案是正确的,因为您对问题中的代码进行了编辑。原始代码会导致相同的错误。我已经回滚了你的编辑。请不要在要求 OP 的问题中编辑代码,请参阅When should I make edits to code?。 本,感谢您提供的信息。我编辑了代码,因为顶部的注释没有正确关闭。我认为这是将代码复制粘贴到问题中的错误。【参考方案2】:您的END IF;
前面有一个END;
,这是导致问题的原因
所以 Oracle 认为 IF
语句没有关闭。另外它会忽略END
!之后的所有代码!
【讨论】:
不,END
没问题,因为他在 IF
块中有一个 declare - begin - end
块。
Alen - 感谢您的回答,实际上我之前尝试过。问题是当我做出您建议的更改时,无法识别此之后的 INSERT INTO JOB_LOG 语句。 70/1 PL/SQL:忽略 SQL 语句 73/148 PL/SQL:ORA-00984:此处不允许列【参考方案3】:
IF rec_count > 0 THEN
BEGIN
DECLARE
CURSOR email IS
SELECT EMAIL_ID
FROM ERROR_EMAIL_NOTIFICATION
WHERE ACTIVE = 'Y' AND
SEVERITY_CD = 'ERROR';
vFROM VARCHAR2(30) := 'WORK_SYSTEM@XXX.COM';
vTYPE VARCHAR2(30) := 'text/plain; charset=us-ascii';
msg_body VARCHAR2(4000) := 'BI jobs are still running, please investigate.
bi_get_transactional_data, bi_get_reference_data)';
crlf CONSTANT VARCHAR2(2):= CHR(13) || CHR(10);
BEGIN
FOR email_rec IN email
LOOP
utl_mail.send(vFROM, email_rec.EMAIL_ID, NULL, NULL, ora_database_name || ': ' ,
msg_body, vTYPE, NULL);
END LOOP;
END;
END;
END IF;
--rest of the code
问题在于,在“DECLARE”之后,您需要在“END LOOP”之后添加“BEGIN”和“END”。我希望你明白。这也让我想知道,您是否需要在“声明”上方添加的“开始”?希望这能解决它:)
【讨论】:
谢谢 Tom,但我应该在哪里添加这段代码,在 END 和 END LOOP 之间? 请检查编辑...当我们遇到编码问题时它通常可以工作。 在第一个 END 语句之后仍然没有执行插入语句。也许我的过程中不能有多个 BEGIN/END 语句? 拥有多个 begin end 语句根本不是问题,我已经看到了很多,并且在一些复杂的存储过程中,我看到人们将来自大型数据库的每个 select 查询放在单独的 begin -异常-结束块..所以无论如何这都不是问题。让我再检查一下,.. 终于明白了,希望这能让你走上正轨,试试这个......以上是关于oracle程序错误PLS-00103遇到符号“END”[关闭]的主要内容,如果未能解决你的问题,请参考以下文章