2017-03-17 91 views
0
CREATE OR REPLACE FUNCTION func 
RETURN varchar2 AS 
myvar INT; 
BEGIN 
    select 1 into myvar from dual where 1=2; 
    IF myvar IS NULL THEN 
    return 'n'; 
    ELSE 
    return 'y'; 
    END IF; 
END; 


SELECT func() FROM DUAL; 

为什么此函数返回NULL而不是字符串“n”,则检查变量为空?如果条件为

+1

因为you're得到一个异常的'no_data_found'('插入into'这里不会得到任何数据,这将引发异常),并就好像没有发生回报=>'null'作为回报 – SomeJavaGuy

+1

SomeJavaGuy搞定了。 PL/SQL中的SELECT ... INTO ...语句必须返回一行,否则会引发异常:如果不返回行,则返回“NO_DATA_FOUND”,返回两行或多行则返回“TOO_MANY_ROWS”。 –

回答

2

因为you're变得异常为no_data_foundinsert into这里不会得到任何数据,这将引发异常),并就好像没有发生回报=>null作为回报:

CREATE OR REPLACE FUNCTION func 
RETURN varchar2 AS 
myvar INT; 
BEGIN 
    select 1 into myvar from dual where 1=2; 
    IF myvar IS NULL THEN 
    return 'n'; 
    ELSE 
    return 'y'; 
    END IF; 
-- This will execute now 
exception 
    when no_data_found then 
     return 'no_data_found'; 
    -- Just to note, when it has 2 rows+ that´s the other possible exception here 
    when to_many_rows then 
     return 'to_many_rows'; 
END; 
/
SELECT func() FROM DUAL; 

O/P

no_data_found