2

関数に関連する次のエラーを受け取る:

'行 20 のエラー: PLS-00103: 次のいずれかを期待しているときに、シンボル「ファイルの終わり」が発生しました: 終了プラグマではなく、最終的なインスタンス化可能な順序が静的メンバー コンストラクター マップをオーバーライドしています 0.01 秒

CREATE OR REPLACE FUNCTION Function1
RETURN FLOAT
IS 
    PricePerBug FLOAT,
    NumberOfBugs NUMBER,
    TotalIncome FLOAT;
BEGIN
    SELECT SUM(ProjectValue) INTO TotalIncome FROM tblProject;
    SELECT COUNT(idBug) INTO NumberOfBugs FROM tblBug;
    PricePerBug := (NumberOfBugs)/(TotalIncome);
    RETURN PricePerBug;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('No data found, no result to display; exception handled...');
    WHEN TOO_MANY_ROWS THEN
    RETURN 'Too many rows returned...';
    WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20015, 'Unknown exception in function Function1.');
END Function1;
/

任意の提案をいただければ幸いです...

4

1 に答える 1

7

宣言はすべて、コンマではなくセミコロンで終了する必要があります。

PricePerBug FLOAT;
NumberOfBugs NUMBER;
TotalIncome FLOAT;

例外処理に関して、このエラーとは関係のない他の問題があります。

  1. NO_DATA_FOUND が発生した場合 (発生することはありません)、例外を処理しても値を返さないため、「ORA-06503: PL/SQL: 関数が値なしで返されました」というエラーが発生します。

  2. TOO_MANY_ROWS が発生した場合 (発生することはありません)、FLOAT 型の値のみを返す関数から「Too many rows returned...」というテキストを返すことができないため、エラーが発生します。

  3. 他の例外が発生した場合 (発生する可能性があります)、有用な Oracle 例外を独自の役に立たない「不明な例外」メッセージに置き換えるため、それが何であるかはわかりません。

この特定の関数のエラー処理の正しい量は、なしです。つまり、次のようになります。

CREATE OR REPLACE FUNCTION Function1
RETURN FLOAT
IS 
    PricePerBug FLOAT;
    NumberOfBugs NUMBER;
    TotalIncome FLOAT;
BEGIN
    SELECT SUM(ProjectValue) INTO TotalIncome FROM tblProject;
    SELECT COUNT(idBug) INTO NumberOfBugs FROM tblBug;
    PricePerBug := (NumberOfBugs)/(TotalIncome);
    RETURN PricePerBug;
END Function1;
于 2011-04-26T12:05:53.603 に答える