2015-12-13 103 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