甲骨文的PL / SQL字符串比较问题

1).Hello,我有可能会从你们的角度生锈以下Oracle PL / SQL代码:

DECLARE str1 varchar2(4000); str2 varchar2(4000); BEGIN str1:=''; str2:='sdd'; IF(str1<>str2) THEN dbms_output.put_line('The two strings is not equal'); END IF; END; /

这是很明显,两个字符串str1和str2的不相等的,但为什么“两个字符串不等于”不打印出来? 甲骨文是否有另一种常见的方法来比较两个字符串?

--------------解决方案-------------

菲尔指出的,空字符串被视为一个NULL,并且NULL不是相等或不等的任何东西。 如果你希望空字符串或空值,你需要处理那些NVL()

DECLARE
str1 varchar2(4000);
str2 varchar2(4000);
BEGIN
str1:='';
str2:='sdd';
-- Provide an alternate null value that does not exist in your data:
IF(NVL(str1,'X') != NVL(str2,'Y')) THEN
dbms_output.put_line('The two strings are not equal');
END IF;
END;
/


关于空的比较:

据对空值的Oracle 12c的文档,使用空比较IS NULLIS NOT NULL不评估为TRUEFALSE 。 然而,所有其他比较计算结果为UNKNOWN 而不是FALSE 。 该文档还指出:

计算结果为未知条件下的行为几乎像FALSE。 例如,计算结果为UNKNOWN返回任何行的WHERE子句中的条件的SELECT语句。 然而,评估为UNKNOWN的状态在进一步操作FALSE不同的未知状态的评估将评估为UNKNOWN。 因此,没有虚假记载,计算结果为真实的,但不是未知的计算结果为UNKNOWN。

参考表由Oracle提供:

Condition Value of A Evaluation
----------------------------------------
a IS NULL 10 FALSE
a IS NOT NULL 10 TRUE
a IS NULL NULL TRUE
a IS NOT NULL NULL FALSE
a = NULL 10 UNKNOWN
a != NULL 10 UNKNOWN
a = NULL NULL UNKNOWN
a != NULL NULL UNKNOWN
a = 10 NULL UNKNOWN
a != 10 NULL UNKNOWN

我还了解到,我们不应该写PL / SQL假设空字符串将始终评估为NULL:

Oracle数据库目前对待为零长度为空字符值。 然而,这可能不会继续在未来的版本真的,Oracle建议你不要把空字符串相同的空值。

让我们填在你的代码的空白,在逻辑加入其他分支机构,并看看会发生什么:

SQL> DECLARE
2 str1 varchar2(4000);
3 str2 varchar2(4000);
4 BEGIN
5 str1:='';
6 str2:='sdd';
7 IF(str1<>str2) THEN
8 dbms_output.put_line('The two strings is not equal');
9 ELSIF (str1=str2) THEN
10 dbms_output.put_line('The two strings are the same');
11 ELSE
12 dbms_output.put_line('Who knows?');
13 END IF;
14 END;
15 /
Who knows?

PL/SQL procedure successfully completed.

SQL>

所以这两个字符串既不相同,也不是不一样的? 咦?

它归结到这一点。 甲骨文对待空字符串为NULL。 如果我们试图比较空,另一个字符串的结果是不是真非假,它是NULL。 这仍然即使其它字符串也是空的情况。

我比较使用字符串=而不是<> 我发现,在这种情况下=似乎比工作更合理的方式<> 我已经指定了两个空(或NULL)字符串相等。 真正实现返回PL / SQL布尔值,但在这里,我改变了,要PLS_INTEGER(0为假,1为真)能够很方便的示范作用。

create or replace function is_equal(a in varchar2, b in varchar2)
return pls_integer as
begin
if a is null and b is null then
return 1;
end if;

if a = b then
return 1;
end if;

return 0;
end;
/
show errors

begin
/* Prints 0 */
dbms_output.put_line(is_equal('AAA', 'BBB'));
dbms_output.put_line(is_equal('AAA', null));
dbms_output.put_line(is_equal(null, 'BBB'));
dbms_output.put_line(is_equal('AAA', ''));
dbms_output.put_line(is_equal('', 'BBB'));

/* Prints 1 */
dbms_output.put_line(is_equal(null, null));
dbms_output.put_line(is_equal(null, ''));
dbms_output.put_line(is_equal('', ''));
dbms_output.put_line(is_equal('AAA', 'AAA'));
end;
/

第一个问题:

也许该消息没有打印出来,因为你已经输出关闭。 使用这些命令来打开它:

set serveroutput on
exec dbms_output.enable(1000000);

关于第二个问题:

我的PLSQL是相当生疏,所以我不能给你一个完整的片段,但你需要遍历结果集的SQL查询和CONCAT所有串在一起。

分类:SQL 时间:2012-01-01 人气:0
分享到:

相关文章

  • SQL和PL-SQL的区别 2012-08-20

    有人可以突出PL-SQL和SQL之间的主要区别是什么? 哪一个你推荐一个新手谁愿意潜入DBA? --------------解决方案------------- SQL是一种查询语言,它可以发出一个查询或执行一个插入/更新/删除. PL-SQL是Oracle的"程序设计语言"SQL,它可以让你写一个完整的程序(循环,变量等)来实现多个选择/插入/更新/删除. 你应该先学习SQL,然后转移到PL-SQL. 你可能会需要既要与Oracle DBA. 1.)SQL是一种面向数据的语言选择和操纵

  • SQL,PL-SQL和T-SQL之间的区别是什么? 2012-10-16

    SQL,PL-SQL和T-SQL之间的区别是什么? 谁能解释一下这三者之间的差异,并提供场景,每个会贴切使用? --------------解决方案------------- SQL是一种查询语言的集合操作. 这或多或少规范,使用的几乎所有的关系数据库管理系统:SQL服务器,Oracle,MySQL和PostgreSQL,DB2,Informix的等等. PL/SQL是由Oracle专有的过程语言 PL/pgSQL是使用PostgreSQL的过程语言 TSQL是在SQL Server中使用微软专

  • 什么是SQL Server 2008 R2中的另类到Oracle 11g RAC? 2013-03-01

    问候Overflowers, 什么是SQL Server 2008 R2中的另类到Oracle 11g RAC? 他们如何比较? 我需要利用廉价的计算机上运行相同的数据库大多只读并行/分布式查询. 此致 --------------解决方案------------- MySQL的听起来像在廉价硬件的廉价替代品. 无操作系统授权. SQL Server比甲骨文好 - 或者是周围的其他方式? 如果你可以列出更多的要求,建议可能作出.

  • 你会考虑使用替代MS SQL Server Management Studio中? 2013-04-28

    在工作​​中我们最近从Microsoft SQL Server 7升级到SQL 2005数据库引擎是很多更先进的,但管理工作室是在许多方面很可怕. 我们大部分的开发者决定他们更愿意坚持使用旧的查询分析器工具,尽管它有很大的局限性. 在我的业余时间,我决定写一个替代查询分析器/ Management Studio中的所做的事我们的开发人员最需要做的. 我终于得到允许释放它是免费的:Versabanq Squel(versabanq.com/squel). 就像我说的,它是免费的,所以这不是一个销售

  • 在Oracle中的浏览器类似SQL Server Management Studio中的语法高亮 2013-11-18

    您好我使用很长一段时间MS SQL和SQL Server Management Studio中没有我开始与Oracle和尝试在甲骨文的浏览器的一些SQL命令,但它hasn’吨的语法高亮. 它存在类似的SQL Server Mamagement工作室为Oracle? --------------解决方案------------- 如果你很高兴与安装在本地的东西(或至少它解压缩),去与SQL Developer的Xavinou的建议或商业的IDE,如蟾蜍或PL / SQL开发人员之一

  • 如何调用从PLSQL程序中的shell脚本 2013-12-18

    可否请你让我知道如何调用从PLSQL程序中的shell脚本? --------------解决方案------------- 而一个第四的方式(在Pablo的顶部)DBMS_PIPE http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:16212348050 在Oracle7.0及以上,我们可以使用dbms_pipes交谈的数据库之外运行的后台程序. 下面是一个使用sqlplus的是守护一个简单的例子: create

  • SQL Server Management Studio中Express和MySQL的? 2014-05-31

    有没有与MySQL数据库一起使用SQL Server Management Studio Express的一种方式? 我想即使它的工作原理,智能感知不会工作? 谢谢! --------------解决方案------------- 它不会随着产品的MySQL.The名称为"SQL Server Management Studio中"的作品,所以它管理SQL Server实例. 如果您需要具有类似功能的工具,尝试蟾蜍为MySQL,它是免费软件或甲骨文的SQLDeveloper. 我不明白

  • SQL Server Management Studio中的替代品进行浏览/编辑表和运行查询 2014-10-12

    我想知道是否有微软的SQL Server Management Studio中的任何替代方案? 不是有什么毛病SSMS,但有时它只是似乎太大了一个应用程序,所有我想要的待办事项是浏览/编辑表和运行查询. --------------解决方案------------- 我已经开始使用LinqPad. 除了比SSMS更轻巧,还可以练习写作LINQ queries-不是无聊的老TSQL的方式更多的乐趣! 蟾蜍为MS SQL看起来相当不错. 我从来没有使用过的个人,但我已经使用Quest的其他产品和他们

  • Oracle SQL Developer中VS SQL Server Management Studio中 2015-01-21

    我刚安装的Oracle SQL Developer,它连接到我的SQL Server. 我喜欢自己暴露于不同的环境. 我想知道如果任何人认为甲骨文的SQL IDE拥有对SQL Server的IDE任何好处知道. 没有任何理由可言,为什么我要保持Oracle IDE,如果我此刻玩的唯一SEVER是SQL Server的? 谢谢! --------------解决方案------------- 我想不出任何好处或理由使用的Oracle SQL Developer,如果你只做SQL Server的发展

  • 可在SSIS包与VS.net 2008年访问的SQL Server 2005数据库中创建? 2012-01-02

    可在SSIS包与VS.net 2008年访问的SQL Server 2005数据库中创建? 包在VS.net 2008年创建行动/包中的方法将读取并从/到SQL Server 2005数据库写. 包会被处决/从SQL Server 2008的服务器上运行. 这是一个支持的方案? 我说:DBA没有,但我的想法是,这将是一样,如果你做一个访问的Oracle / DB2 /平面文件VS.net 2008 SSIS包. 不会SQL Server 2005的只是一个数据存储在这种情况下? --------

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.235 (s). 10 q(s)