2017-05-01 9 views
1

のnullを返します。機能ではなく、期待値

SELECT pacjent_usun_PK_ERROR(5) from dual 

(PESEL =「5」私のテーブルに存在しない)

この関数は、NULLを返します。

しかし、私は有効な値渡し:

SELECT pacjent_usun_PK_ERROR(1) from dual 

を(PESEL = '1' 私のテーブルに存在する)

機能がを返します。ここで

は私の関数である:

私は手動挿入PRZYJECIEIDで、私の関数から私の最後のSELECTをテスト
CREATE OR REPLACE FUNCTION pacjent_usun_PK_ERROR 
    (PES IN NUMBER) 
    RETURN NUMBER 
IS 
    ILE NUMBER; 
    ZMIENNA NUMBER; 
BEGIN 
    SELECT PACJENTID INTO ZMIENNA FROM PACJENT WHERE PESEL=PES; 

    SELECT COUNT(PRZYJECIEID) INTO ILE FROM PRZYJECIE_NA_ODDZIAL 
    WHERE PACJENTID=ZMIENNA and rownum=1; 

    RETURN ILE; 
END; 

(PACJENTID = '1111' 私のテーブルに存在しない)

SELECT COUNT(PRZYJECIEID) FROM PRZYJECIE_NA_ODDZIAL WHERE PACJENTID='1111' and rownum=1; 

結果は次のとおりです。

とテストウィット時間PACJENTID =「1」(私のテーブルに存在し)

結果は次のとおりです。

私は関数は行がないNULLの代わりに0を返す理由を理解しようとしています。

Oracle SQL Developerを使用しています

+1

適切なタグを付けてください。 MySQLとOracleは構文が異なります。 –

+0

私はそれを得たと思う...(逐次編集を参照)。 – mathguy

答えて

2

この動作の原因はわかりません。もし私がそれを理解することができれば、私は再び投稿するでしょう。

いずれの場合でも、次のバージョンが動作するはずです。私は標準(Oracle)SCOTTスキーマでテーブルEMPとDEPTを使用して同様の関数を作成しました。以下に示す変更がその設定で機能しました。基本的に私は中間変数を削除します。私は単一のクエリと割り当てですべてを行います。

create or replace FUNCTION pacjent_usun_PK_ERROR 
(PES IN NUMBER) 
RETURN NUMBER 
IS 
    ILE NUMBER; 
BEGIN 
    SELECT COUNT(PRZYJECIEID) INTO ILE 
    FROM PRZYJECIE_NA_ODDZIAL 
    WHERE PACJENTID=(SELECT PACJENTID FROM PACJENT WHERE PESEL=PES) 
    and rownum=1; 
RETURN ILE; 
end; 

追加は:明確にする... select into...返さない行は、PL/SQLは例外、特にNO_DATA_FOUND例外を発生させる必要がある場合。調査の価値がある謎は、この場合にPL/SQLがこの例外を発生させない理由です。

最終編集 - これはPL/SQLプロシージャではなく、PL/SQLファンクションでは常に動作していたようです。 NO_DATA_FOUNDは例外です(通常の方法で処理できます)。が呼び出されません。 https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11_question_id:10321465390114

これは、最初のselect intoがデータを返さないとき、関数が未処理の例外状態にあることを意味します。これは、第2のselect intoのカウントが0にならない理由です。実行するとそれほど遠くまで到達しません。

これはまた、あなたがそれは正確にあなたの関数のコードを維持することを意味しますが、ブロックを例外処理を追加する必要があります。

exception 
    when no_data_found then return 0; 

私は私の「モックでこれをテストした右end;

前にあなたの関数(SCOTTスキーマ内)の "-up"とそれが機能します。

+0

ありがとう、完璧な作品。 – aaaa

関連する問題