首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORACLE中的null处理

ORACLE中的null处理
EN

Stack Overflow用户
提问于 2013-12-21 11:18:30
回答 3查看 346关注 0票数 0

存储过程如下所示。

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE FIRSTPROC (ID1 IN VARHAR2, ID2 OUT NUMBER )
AS 

BEGIN
 SELECT id2val INTO ID2
 FROM 
 WHERE id1val = ID1;
END

如果我路过

ID1 := 5;

请注意,我的表也包含空值。如何处理这种情况。

ID1 := null;调用过程

EN

回答 3

Stack Overflow用户

发布于 2013-12-21 11:26:10

NULL不等于NULL。因此,当您传入NULL并仅使用相等条件进行查询时,您无法获得匹配。所以我假设你得到了一个没有找到数据的异常(附注:不是说你得到了“一个错误”,而是明确地说你得到了什么错误)。

您必须显式地处理NULL

代码语言:javascript
复制
SELECT id2val INTO id2
FROM whatever
WHERE ( id1val = id1 OR (id1val IS NULL AND id1 IS NULL) )

另一种可能是使用像NVL( id1val, -1 ) = NVL( id1, -1 )这样的条件,其中-1是某个永远不会出现在数据中的值。但这依赖于选择一个好的标记值,并且可能会影响索引对查询的有效性。

请注意,如果您的表包含多个具有ID1VALNULL值的行,则此查询将引发太多的行。

票数 0
EN

Stack Overflow用户

发布于 2013-12-21 11:28:08

NULL不等于NULL,但是您可以使用nvl函数来修复您的相等,如下所示

代码语言:javascript
复制
WHERE nvl(id1val, 'na')=nvl(id1, 'na')
票数 0
EN

Stack Overflow用户

发布于 2013-12-21 16:41:34

比较一个NULL值是否等于另一个值(包括另一个NULL)将始终返回false。相反,您可以比较两个值是否相等,或者第一个值IS NULL和第二个值IS NULL是否相等。

修改my previous answer to your last question

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE FIRSTPROC (
  ID1 IN  table_name.id1val%TYPE,
  ID2 OUT table_name.id2val%TYPE
)
AS
BEGIN
  SELECT id2val
  INTO   ID2
  FROM   table_name
  WHERE  ( id1val = ID1 OR ( ID1 IS NULL AND id1val IS NULL ) );
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    ID2 := NULL;
  WHEN TOO_MANY_ROWS THEN
    ID2 := NULL;
END;
/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20715041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档