2

收到以下与函数有关的错误:

'第 20 行的错误:PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:结束不是 pragma 最终实例化顺序覆盖静态成员构造函数映射 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: Function returned without value”,因为您处理了异常但不返回值。

  2. 如果曾经引发过 TOO_MANY_ROWS(不会出现),您将收到错误消息,因为您无法从仅返回 FLOAT 类型的值的函数返回文本“返回的行数过多...”!

  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 回答