2016-03-07 25 views
0

我在PLSQL中有以下代碼。 我不確定爲什麼IF語句沒有被解僱。 curr_app和the_app變量是不同的,但if語句內的dbms outoutput永遠不會被觸發。我的IF語句無法檢測可區分的差異

DECLARE 
the_app VARCHAR2(200); 
curr_app VARCHAR2(200); 

BEGIN 
    the_app :=''; 
    curr_app :=''; 
    FOR i IN 
    (SELECT APP_NAME,CONTACT_TYPE,CONTACT_DEPT,CONTACT_VALUE 
    FROM CMSv2.CMS_APPLICATIONS CMSA 
    LEFT JOIN CMSV2.CMS_APP_CONTACTS CMSAC 
    ON CMSa.APP_NAME = CMSAC.CONTACT_APP and (CMSAC.END_DT IS NULL and CMSAC.RET_DT IS NULL) 
    WHERE CMSA.END_DT IS NULL 
    AND CMSA.RET_DT IS NULL ORDER BY APP_NAME 
) 
    LOOP 
    curr_app := i.APP_NAME; 
    dbms_output.put_line('curr_app' || curr_app); 
    dbms_output.put_line('the_app' || the_app); 
    IF the_app<>curr_app THEN 
    dbms_output.put_line('doservers for' || i.APP_NAME); 
    END IF; 
    dbms_output.put_line(i.APP_NAME); 

    END LOOP; 
END; 
+1

當''''被分配給一個變量時,它變成一個零長度的字符串。 Oracle將零長度字符串視爲NULL。任何與NULL結果比較的結果都是UNKNOWN。這就是爲什麼,在你的情況下,'如果'情況永遠不會'真實'。 –

+0

僅供參考 - 您可以在聲明變量時初始化變量,如下所示:'the_app VARCHAR2(200):='';' –

回答

1

在Oracle中,一個空字符串相當於NULL

BOOLEAN S之間比較差的真值表是:

A <> B | TRUE | FALSE | NULL 
-------+-------+-------+------- 
TRUE | FALSE | TRUE | NULL 
FALSE | TRUE | FALSE | NULL 
NULL | NULL | NULL | NULL 

所以你IF條件可以簡化爲:

IF(something <> NULL) THEN ... 

這將永遠是正確的。