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。使用CASEIF-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:触发器 - 文件结束错误

Oracle SQL PLS-00103 创建包体时出错

PLS-00103:预期时遇到符号“(”

“PLS-00103:在预期以下之一时遇到符号“END”::=。(%;符号“;”被替换为“END”以继续。“

oracle函数错误pls-00103