0

oracleパッケージ内で特定のタスクを実行する関数を作成したいので、次のコードを試してみましたが、理解できないエラーが発生します。

CREATE OR REPLACE
PACKAGE DINIDU_EXE_PACKAGE AS

FUNCTION EXE14 
(SUP_ID_ SUPPLIER_PART_PROJECT_TAB.SUPPLIER_ID%TYPE,PAR_ID_ SUPPLIER_PART_PROJECT_TAB.PART_ID%TYPE,PRO_ID_ SUPPLIER_PART_PROJECT_TAB.PROJECT_ID%TYPE) RETURN NUMBER IS

QUNTITY_FOR_A_PROJECT_ NUMBER;

BEGIN
  SELECT QUENTITY AS QUNTITY_FOR_A_PROJECT_ FROM SUPPLIER_PART_PROJECT_TAB WHERE SUPPLIER_ID=SUP_ID AND PART_ID=PAR_ID AND PRO_ID=PROJECT_ID;

    IF QUNTITY_FOR_A_PROJECT_ >0 THEN

      RETURN QUNTITY_FOR_A_PROJECT_;
    ELSE
      RETURN 0;

    END IF;

END EXE14;

END;

エラー(6,1):PLS-00103:次のいずれかを予期しているときに、記号「QUNTITY_FOR_A_PROJECT_」が検出されました:言語

4

2 に答える 2

2

Egor のコメントは正しい。代わりにパッケージ本体にある必要がある関数をパッケージ仕様に入れています。

関数またはそのシグネチャ (関数名と引数リスト) への参照のみがパッケージ仕様に含まれている必要があります。実際の関数は本体にコーディングする必要があります。

CREATE OR REPLACE PACKAGE DINIDU_EXE_PACKAGE AS
    FUNCTION EXE14 
    ( SUP_ID_ SUPPLIER_PART_PROJECT_TAB.SUPPLIER_ID%TYPE
    , PAR_ID_ SUPPLIER_PART_PROJECT_TAB.PART_ID%TYPE
    ,PRO_ID_ SUPPLIER_PART_PROJECT_TAB.PROJECT_ID%TYPE)
END;
/

CREATE OR REPLACE PACKAGE BODY DINIDU_EXE_PACKAGE AS
    FUNCTION EXE14 
    ( SUP_ID_ SUPPLIER_PART_PROJECT_TAB.SUPPLIER_ID%TYPE
    , PAR_ID_ SUPPLIER_PART_PROJECT_TAB.PART_ID%TYPE
    ,PRO_ID_ SUPPLIER_PART_PROJECT_TAB.PROJECT_ID%TYPE)
RETURN NUMBER IS
    QUNTITY_FOR_A_PROJECT_ NUMBER;
BEGIN
  SELECT QUENTITY AS QUNTITY_FOR_A_PROJECT_ FROM SUPPLIER_PART_PROJECT_TAB WHERE SUPPLIER_ID=SUP_ID AND PART_ID=PAR_ID AND PRO_ID=PROJECT_ID;

    IF QUNTITY_FOR_A_PROJECT_ >0 THEN

      RETURN QUNTITY_FOR_A_PROJECT_;
    ELSE
      RETURN 0;

    END IF;

END EXE14;

END;
/
于 2013-03-19T09:28:19.437 に答える
1

編集: コンパイル エラーの実際の原因については、Egor のコメントと Rachcha の回答を参照してください。

コードは最初QUNTITY_FOR_A_PROJECT_にローカル変数として宣言しますが、SELECTステートメントは同じ識別子を列エイリアス ( QUENTITY AS QUNTITY_FOR_A_PROJECT_) として使用します。INTOさらに重要なことは、結果を何も選択していないことです。

私はあなたがこのようなことをするつもりだったと思います:

SELECT QUENTITY INTO QUNTITY_FOR_A_PROJECT_ FROM SUPPLIER_PART_PROJECT_TAB ...

別の問題: 関数は次のパラメーターを受け入れます: SUP_ID_PAR_ID_およびPRO_ID_、ただし、関数でそれらを使用しません。SUPPLIER_PART_PROJECT_TABクエリで識別子が正しく使用されていないと思われますが、テーブルの列が何であるかがわからないため、確実にはわかりません。

于 2013-03-19T07:22:42.967 に答える