这是一个关于Oracle PL / SQL中字符串比较的问题。我正在测试一些涉及空白填充和非空白填充比较的简单片段,我遇到了一个特定的情况,我无法得到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 **
关于字符串文字比较,我希望得到在Oracle documentation上报告的内容;我引用了关键句:
尾随空格在字符串文字中很重要,所以' abc'和' abc'是不同的。 PL / SQL处理期间不会修剪字符串文字中的尾随空白,但如果将该值插入CHAR类型的表列中,则会对其进行修剪。有关其他信息(包括NCHAR字符串文字),请参阅"字符串文字"。
有什么想法解释我发现的东西吗?这可能取决于我的Oracle环境/会话中的特定设置吗?
答案 0 :(得分:1)
这是因为' MP'和' MP'是CHAR
值,oracle会自动填充您为该变量赋值的任何值,其中空格为指定的最大长度
如果声明长度大于1的CHAR变量,则为Oracle 数据库会自动填充您为该变量指定的任何值 空格到最大长度
请参阅与您的示例类似的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
,因为"逻辑"用空格填充"逻辑"