我正在尝试使用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;
,但这无助于解决问题。
答案 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支持。
......
...... 数据类型不能指定长度,精度或比例。 数据库派生返回值的长度,精度或比例 来自调用函数的环境。