2015-12-13 148 views
1

下面是關於Oracle PL/SQL中字符串比較的問題。我正在測試一些涉及空白填充和非空白填充比較的簡單片段,我遇到了一個特殊情況,我無法得到PL/SQL引擎正在做什麼。有關字符串文字的Oracle PL/SQL字符串比較:意外的結果

這裏是我的代碼(我運行在Oracle 12c的這個腳本)

set serveroutput on; 
declare 
    l_char1  char(35)  := 'Hello'; 
    l_char2  char(30)  := 'Hello '; 
    l_varchar21 varchar2(35) := 'Hello'; 
    l_varchar22 varchar2(35) := 'Hello '; 
begin 
    /* When a comparison is made between variables of type CHAR, 
    a blank-padding comparison takes place. */ 
    if (l_char1 = l_char2) then 
     dbms_output.put_line('First comparison is TRUE'); 
    else 
     dbms_output.put_line('First comparison is FALSE'); 
    end if; 

    /* When at least one of the involved variables is a VARCHAR2, 
    then a non-blank-padding comparison takes place. None of the  
    variables involved in the comparison is then modified. */ 
    if (l_char1 = l_varchar21) then 
     dbms_output.put_line('Second comparison is TRUE'); 
    else 
     dbms_output.put_line('Second comparison is FALSE'); 
    end if; 

    /* yet another non-blank-padding comparison */ 
    if (l_varchar21 = l_varchar22) then 
     dbms_output.put_line('Third comparison is TRUE'); 
    else 
     dbms_output.put_line('Third comparison is FALSE'); 
    end if; 

    /* Strange behaviour: I supposed both string literals to be 
    treated as VARCHAR2, so I expected to get FALSE. */ 
    if ('MP' = 'MP ') then 
     dbms_output.put_line('Fourth comparison is TRUE'); 
    else 
     dbms_output.put_line('Fourth comparison is FALSE'); 
    end if; 
end; 

下面是輸出

Procedura PL/SQL completata correttamente. 
First comparison is TRUE 
Second comparison is FALSE 
Third comparison is FALSE 
Fourth comparison is TRUE ** I expected FALSE ** 

關於字符串常量比較,我希望得到什麼報道甲骨文documentation;我引用了關鍵句:

結尾空格的字符串中顯著,所以「ABC」和「ABC」是不同的。在PL/SQL處理過程中,字符串文字中的尾隨空白不會被修剪,儘管如果您將該值插入到CHAR類型的表格列中,它們會被修剪。有關其他信息,包括NCHAR字符串文字,請參閱「字符串文字」。

任何想法來解釋我發現什麼?這可能取決於我的Oracle環境/會話中的特定設置嗎?

回答

1

這是因爲「MP」和「MP」是CHAR值和Oracle自動墊分配給該變量與空間,以指定

如果聲明一個CHAR變量與長度的最大長度的任何值大於1,甲骨文 數據庫自動墊分配給該變量 空格以達到最大長度

任何值看到類似的OraMag文章,你的榜樣 http://www.oracle.com/technetwork/issue-archive/2011/11-sep/o51plsql-453456.html

BEGIN 
    IF 'Logic' = 'Logic  ' 
    THEN 
    DBMS_OUTPUT.put_line ('Equal'); 
    ELSE 
    DBMS_OUTPUT.put_line ('Not Equal'); 
    END IF; 
END; 

Equal因爲「邏輯」與以「邏輯」

+0

我得出了相同的結論空間,但如何從Oracle文檔報價補齊?我是否誤解了他們的意思,或者錯誤是要修復的? – Max

+0

http://docs.oracle.com/cd/B14117_01/server.101/b10759/sql_elements002.htm '空白填充比較語義 如果這兩個值的長度不同,那麼Oracle首先會將空白添加到較短的一個,所以它們的長度相等。 ....只有當比較中的兩個值都是數據類型CHAR,NCHAR,文本字面值的表達式時,Oracle才使用空白填充的比較語義......' – are