2013-08-23 97 views
0

的Apex 4.2PL/SQL错误和嵌套IF语句

我有以下的PL/SQL代码下面的框,但每当我在APEX运行它,我不断收到错误:

ORA-06550:行35,第4栏:PLS-00103:遇到符号“;”当期望以下之一时:如果

DECLARE 
    show_changes BOOLEAN; 
    l_exists INTEGER; 

BEGIN 

Select count(*) into l_exists 
From dba_role_privs 
where grantee = upper(:APP_USER) and 
(granted_role = 'SURVEY_JOB_SUID' or granted_role = 'SURVEY_SUID'); 

IF l_exists = 0 THEN   /* unauthorized */ 
    IF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND (:P32_SUBMISSION_DATE IS NULL  AND :P32_LOCK_DATE IS NULL) THEN 
      show_changes := TRUE; 
    IF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND (:P32_SUBMISSION_DATE IS NOT NULL AND :P32_LOCK_DATE IS NULL) THEN 
     show_changes := TRUE; 
    IF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND (:P32_SUBMISSION_DATE IS NOT NULL  AND :P32_LOCK_DATE IS NOT NULL) THEN 
      show_changes := FALSE;  
END IF; 
ELSE       /* authorized */ 
    IF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND (:P32_SUBMISSION_DATE IS NULL AND :P32_LOCK_DATE IS NULL) THEN 
      show_changes := TRUE; 
    IF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND (:P32_SUBMISSION_DATE IS NOT NULL AND :P32_LOCK_DATE IS NULL) THEN 
     show_changes := TRUE; 
    IF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND (:P32_SUBMISSION_DATE IS NOT NULL AND :P32_LOCK_DATE IS NOT NULL) THEN 
     show_changes := TRUE; 

END IF; 
Return show_changes; 
END; 

我不确定是什么问题。任何帮助将不胜感激。提前致谢。

+0

你'IF'-条件选择语句的语法错误。请查看[PL/SQL控制语句](http://docs.oracle.com/cd/E11882_01/appdev.112/e17126/controlstatements.htm)。 – user272735

回答

3

一个IF总是必须与END IFELSE配对之前END IF。如果你想在每两个分支的三个独立IF语句在你的外IF,你想要的东西像

IF l_exists = 0 
THEN 
    IF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND 
    (:P32_SUBMISSION_DATE IS NULL  AND :P32_LOCK_DATE IS NULL) 
    THEN 
      show_changes := TRUE; 
    END IF; 
    IF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND 
    (:P32_SUBMISSION_DATE IS NOT NULL AND :P32_LOCK_DATE IS NULL) 
    THEN 
     show_changes := TRUE; 
    END IF; 
    IF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND 
    (:P32_SUBMISSION_DATE IS NOT NULL  AND :P32_LOCK_DATE IS NOT NULL) 
    THEN 
      show_changes := FALSE;  
    END IF; 
ELSE 
    <<repeat the pattern>> 
END IF; 

我的猜测,但问题在于,你真的不希望有三个独立的IF在每个分支中的语句。我的猜测是,你要一个IF声明与ELSIF

IF l_exists = 0 
THEN 
    IF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND 
    (:P32_SUBMISSION_DATE IS NULL  AND :P32_LOCK_DATE IS NULL) 
    THEN 
      show_changes := TRUE; 
    ELSIF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND 
     (:P32_SUBMISSION_DATE IS NOT NULL AND :P32_LOCK_DATE IS NULL) 
    THEN 
     show_changes := TRUE; 
    ELSIF :P32_SURVEY_JOB_REQUEST_ID IS NOT NULL AND 
     (:P32_SUBMISSION_DATE IS NOT NULL  AND :P32_LOCK_DATE IS NOT NULL) 
    THEN 
      show_changes := FALSE;  
    END IF; 
ELSE 
    <<repeat the pattern>> 
END IF;