PLS-00103:在 oracle 函数中预期以下之一时遇到符号“IF”
Posted
技术标签:
【中文标题】PLS-00103:在 oracle 函数中预期以下之一时遇到符号“IF”【英文标题】:PLS-00103: Encountered the symbol "IF" when expecting one of the following in oracle function 【发布时间】:2015-09-30 09:06:59 【问题描述】:我正在编写以下函数,其中出现PLS-00103: Encountered the symbol "IF" when expecting one of the following: ( - + case mod new null <an identifier>
错误。我知道这个错误出现在我试图用 THRESHOLD_MIN_ALERT
string 附加 if 条件的那一行。我想在字符串 Minimum Threshold
后面加上 if 条件和值。例如,对于Minimum threshold
,如果V_THRESHOLD_MIN_ALERT = Y
then 应该是这样的
THRESHOLD_MIN_ALERT(Alert Configured) 100
如果V_THRESHOLD_MIN_ALERT = N
那么
THRESHOLD_MIN_ALERT 100
如果我删除 if 条件,那么我的函数运行正常。我不知道如何附加 if 代码的语法。这是我的函数:
FUNCTION BUILD_ALERT_EMAIL_BODY
(
IN_ALERT_LOGS_TIMESTAMP IN TIMESTAMP
) RETURN VARCHAR2 AS
BODY VARCHAR2(4000) := '';
V_KPI_DEF_ID NUMBER := '';
V_KPI_TYPE_ID NUMBER := '';
V_KPI_THRESHOLD_MIN_VALE NUMBER := '';
V_KPI_THRESHOLD_MAX_VALE NUMBER := '';
V_THRESHOLD_MIN_ALERT NUMBER;
BEGIN
Select KPI_DEF_ID INTO V_KPI_DEF_ID FROM KPI_LOGS WHERE KPI_LOG_ID = IN_KPI_LOG_ID;
Select KT.KPI_TYPE_ID INTO V_KPI_TYPE_ID FROM KPI_DEFINITION KD JOIN KPI_TYPE KT ON KD.KPI_TYPE = KT.KPI_TYPE_ID WHERE KD.KPI_DEF_ID = V_KPI_DEF_ID;
Select THRESHOLD_MAX_VAL INTO V_KPI_THRESHOLD_MAX_VALE FROM KPI_DEFINITION WHERE KPI_DEF_ID = V_KPI_DEF_ID;
Select THRESHOLD_MIN_VAL INTO V_KPI_THRESHOLD_MIN_VALE FROM KPI_DEFINITION WHERE KPI_DEF_ID = V_KPI_DEF_ID;
Select THRESHOLD_MIN_ALERT INTO V_THRESHOLD_MIN_ALERT FROM KPI_DEFINITION WHERE KPI_DEF_ID = V_KPI_DEF_ID;
Select THRESHOLD_Max_ALERT INTO V_THRESHOLD_MAX_ALERT FROM KPI_DEFINITION WHERE KPI_DEF_ID = V_KPI_DEF_ID;
BODY := 'ALERT TIMESTAMP : ' || to_char(IN_ALERT_LOGS_TIMESTAMP,'DD.MM.YYYY HH24:MI') || Chr(13) || Chr(10);
IF ((V_KPI_TYPE_ID = 18) OR (V_KPI_TYPE_ID = 19)) THEN
BODY := BODY || 'Minimum Threshold' || if (V_THRESHOLD_MIN_ALERT = Y) then '(Alert Configured)' END IF; || V_KPI_THRESHOLD_MIN_VALE || Chr(13);
END IF;
RETURN BODY;
END BUILD_ALERT_EMAIL_BODY;
【问题讨论】:
【参考方案1】:问题出在下面的 IF-END IF 块中:
IF (V_THRESHOLD_MIN_ALERT = Y)
THEN
'(Alert Configured)'
END IF;
|| V_KPI_THRESHOLD_MIN_VALE || Chr(13);
END IF;
-
您需要将值分配给一个变量。
“Y”是一个字符串,而不是布尔值。您必须用单引号将其括起来。
例如,
IF (V_THRESHOLD_MIN_ALERT = 'Y')
THEN
BODY := BODY||'(Alert Configured)';
ELSE
BODY := BODY|| V_KPI_THRESHOLD_MIN_VALE || Chr(13);
END IF;
或者,您可以使用 CASE 表达式:
例如,
BODY := BODY || 'Minimum Threshold' ||
CASE
WHEN V_THRESHOLD_MIN_ALERT = 'Y' THEN
'Alert Configured'
END || V_KPI_THRESHOLD_MIN_VALE || Chr(13);
还有,
BODY VARCHAR2(4000) := '';
BODY 是Oracle keyword。最好使用不同的名称。
例如,
v_body VARCHAR2(4000) := '';
【讨论】:
当我使用解码时,我收到错误为 Error(1405,45): PLS-00204: function or pseudo-column 'DECODE' may be used inside a SQL statement only @Rahul 抱歉DECODE
仅适用于 SQL,不适用于 PL/SQL。使用CASE
或IF-ELSE
。查看更新【参考方案2】:
编辑:还将BODY
更改为上面建议的其他变量
如下更改您的 IF ELSE 逻辑。
IF ((V_KPI_TYPE_ID = 18) OR (V_KPI_TYPE_ID = 19)) THEN
IF V_THRESHOLD_MIN_ALERT = Y then
BODY := BODY || 'Minimum Threshold' || '(Alert Configured)' || V_KPI_THRESHOLD_MIN_VALE || Chr(13);
else
BODY := BODY || 'Minimum Threshold' || V_KPI_THRESHOLD_MIN_VALE || Chr(13);
end if;
end if;
【讨论】:
以上是关于PLS-00103:在 oracle 函数中预期以下之一时遇到符号“IF”的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SP:PLS-00103:在预期以下情况之一时遇到符号“`”:
Oracle - PLS-00103:触发器 - 文件结束错误