2017-03-17 25 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; 

はなぜ、この機能ではなく、「n」は文字列のNULLを返す場合のnull?チェック変数は、条件

+1

('文句を言わないinto'挿入し、ここで任意のデータを取得し、これには例外が発生します)、ノーリターンはリターン – SomeJavaGuy

+1

SomeJavaGuyとして=> 'null'なのでを起こらないかのようにばっちり成功。 PL/SQLのSELECT ... INTO ...文は、まったく1つの行を返す必要があります。それ以外の場合は、例外が発生します。行がない場合は 'NO_DATA_FOUND'、2行以上戻された場合は' TOO_MANY_ROWS'です。 –

答えて

2

you'reがno_data_foundのように例外を取得(insert 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 you'reがno_data_found` `のように例外を取得しているため

no_data_found