【问题标题】:How do procedures work with object types in PL/SQL?过程如何处理 PL/SQL 中的对象类型?
【发布时间】: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


【解决方案1】:

哦,解决了。

MEMBER PROCEDURE IncrementValueAsProcedure
IS
    MyType TestType := SELF;
BEGIN
    MyType.TestValue := TestValue + 1;
END;

这会创建当前对象的副本并对其进行更新。以下按预期工作:

MEMBER PROCEDURE IncrementValueAsProcedure
IS
BEGIN
    TestValue := TestValue + 1;
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 2015-01-10
    • 1970-01-01
    相关资源
    最近更新 更多