0

関数にSQLクエリがあります

SELECT  DISTINCT (product_id)
      INTO  prod
      FROM  products
     WHERE       mfg_no = 'TEL'             
                AND status = p_status

product_id が null になるか、p_status にデータがない場合があります。この関数のため、値は返されません。

product_id を確認するために nvl,decode および case ステートメントを試しましたが、どれも機能しませんでした。product_id が null または空の場合でも、関数が正常に実行されるようにするにはどうすればよいですか?

次のような EXCEPTION ブロックで値を返そうとしましたが、どちらも役に立ちませんでした。

EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        prod := 'NA';

編集 1

CREATE OR REPLACE FUNCTION my_function (p_status VARCHAR2)
    RETURN VARCHAR2
AS
    prod     VARCHAR2 (2000);
BEGIN
    prod := NULL;  


    SELECT  DISTINCT (product_id)
      INTO  prod
      FROM  products
     WHERE  mfg_no = 'TEL' AND status = p_status;

    RETURN prod;
EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        prod := 'N/A';
        DBMS_OUTPUT.put_line ('no data found ' || SQLERRM);
    WHEN OTHERS
    THEN
        DBMS_OUTPUT.put_line ('error ' || SQLERRM);
        prod := 'N/A';
END;
4

2 に答える 2

1

このようにしてみてください:

CREATE OR REPLACE FUNCTION my_function (p_status VARCHAR2)
    RETURN VARCHAR2
AS
    prod     VARCHAR2 (2000);
BEGIN
    prod := NULL;

  BEGIN
    SELECT  DISTINCT (product_id)
      INTO  prod
      FROM  products
     WHERE  mfg_no = 'TEL' AND status = p_status;

  EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        prod := 'N/A';
        DBMS_OUTPUT.put_line ('no data found ' || SQLERRM);
    WHEN OTHERS
    THEN
        DBMS_OUTPUT.put_line ('error ' || SQLERRM);
        prod := 'N/A';
  END;

  RETURN prod;

END;

レコードなしnull値の違いを確認するには、このsqlfiddleデモを参照してください

于 2012-12-03T13:29:40.340 に答える
1

DISTINCT / 例外処理の代わりに NVL / MAX を使用する別のソリューション:

CREATE OR REPLACE FUNCTION my_function (p_status VARCHAR2)
    RETURN VARCHAR2
AS
    prod     VARCHAR2 (2000);
BEGIN
    SELECT  NVL(MAX(product_id), 'N/A')
      INTO  prod
      FROM  products
     WHERE  mfg_no = 'TEL' AND status = p_status;
  RETURN prod;

END;
于 2012-12-03T13:50:13.983 に答える