【发布时间】:2017-07-05 08:01:37
【问题描述】:
我不完全理解 PL/SQL 对象类型的过程的目的。从网上阅读,我得到的印象是函数不应该修改数据而应该只返回一个值,而是应该使用过程,但是对于对象类型,过程中的更改似乎不会传播到本地上下文之外:
CREATE OR REPLACE TYPE TestType FORCE
AS OBJECT
(
TestValue NUMBER
, CONSTRUCTOR FUNCTION TestType
RETURN SELF AS RESULT
, MEMBER PROCEDURE IncrementValueAsProcedure
, MEMBER FUNCTION IncrementValueAsFunction
RETURN TestType
)
/
CREATE OR REPLACE TYPE BODY TestType
AS
CONSTRUCTOR FUNCTION TestType
RETURN SELF AS RESULT
IS
BEGIN
SELF.TestValue := 0;
RETURN;
END;
MEMBER PROCEDURE IncrementValueAsProcedure
IS
MyType TestType := SELF;
BEGIN
MyType.TestValue := TestValue + 1;
END;
MEMBER FUNCTION IncrementValueAsFunction
RETURN TestType
IS
MyType TestType := SELF;
BEGIN
MyType.TestValue := TestValue + 1;
RETURN MyType;
END;
END;
/
DECLARE
MyTest TestType;
BEGIN
MyTest := TestType();
DBMS_OUTPUT.PUT_LINE(MyTest.TestValue);
MyTest.IncrementValueAsProcedure();
DBMS_OUTPUT.PUT_LINE(MyTest.TestValue);
MyTest := MyTest.IncrementValueAsFunction();
DBMS_OUTPUT.PUT_LINE(MyTest.TestValue);
END;
这给出了输出:
0
0
1
因此更新过程中的更改尚未被采纳。我做错了什么?
【问题讨论】:
-
@user7294900 这是专门针对对象类型的,其中没有提到。我的一般问题是为什么对象类型似乎与该线程中的建议相反。
-
@user7294900 不是重复的 - 这是过程和函数之间的一般区别,这是针对对象成员过程/函数的特定行为/语法。
标签: sql oracle plsql object-type