Oracle错误:ORA-00900:无效的SQL语句

时间:2016-03-11 17:43:12

标签: sql database oracle oracle11g

我正在尝试使用2个函数创建以下数据类型:

-- Employee

CREATE OR REPLACE TYPE EmployeeType AS OBJECT (
    EmployeeNumber NUMBER,
    EmployeeName VARCHAR2(150),
    EmployeeAddress VARCHAR2(255),
    MAP MEMBER FUNCTION getEmployeeNumber RETURN NUMBER,
    MEMBER FUNCTION CalculateSalary RETURN FLOAT(2)
)
NOT FINAL;
CREATE OR REPLACE TYPE BODY EmployeeType AS

    MAP MEMBER FUNCTION getEmployeeNumber RETURN NUMBER IS
    BEGIN
        RETURN EmployeeNumber;
    END;
     -- function that can be overriden by subtypes, make abstract
    MEMBER FUNCTION CalculateSalary RETURN FLOAT(2) IS
    BEGIN
         -- function returns empty, has to be overwritten by fulltimeemployee
        RETURN 0.00;
    END;
END; 

但是我一直收到错误说明

ERROR: ORA-00900: invalid SQL statement

Error Code: 900

Query = END

我正在使用RazorSQL来执行我的查询,我似乎无法得到导致此错误的行号,但通过反复试验我发现它是我TYPE BODY定义中的函数描述之一。

我尝试在最后一次/之后添加END;,但这无助于解决问题。

1 个答案:

答案 0 :(得分:2)

FLOAT(2)替换为FLOAT

CREATE OR REPLACE TYPE EmployeeType AS OBJECT (
    EmployeeNumber NUMBER,
    EmployeeName VARCHAR2(150),
    EmployeeAddress VARCHAR2(255),
    MAP MEMBER FUNCTION getEmployeeNumber RETURN NUMBER,
    MEMBER FUNCTION CalculateSalary RETURN FLOAT
)
NOT FINAL;
/
CREATE OR REPLACE TYPE BODY EmployeeType AS

    MAP MEMBER FUNCTION getEmployeeNumber RETURN NUMBER IS
    BEGIN
        RETURN EmployeeNumber;
    END;
     -- function that can be overriden by subtypes, make abstract
    MEMBER FUNCTION CalculateSalary RETURN FLOAT IS
    BEGIN
         -- function returns empty, has to be overwritten by fulltimeemployee
        RETURN 0.00;
    END;
END; 
/

CREATE TYPE的文档没有提到这一点,但您可以在与CREATE FUNCTION相关的主题中找到解释:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/create_function.htm RETURN数据类型

  

RETURN数据类型
对于数据类型,请指定函数返回值的数据类型。返回值可以包含任何数据类型   PL / SQL支持。
  ......
...... 数据类型不能指定长度,精度或比例。   数据库派生返回值的长度,精度或比例   来自调用函数的环境。