如何在PL / SQL Oracle中使用REF类型?

时间:2018-12-30 16:28:56

标签: oracle plsql user-defined-types

我有以下代码:

CREATE OR REPLACE TYPE t_abonnement_type AS OBJECT
(
  ref_abonnement_type NUMBER,
  type_abonne         VARCHAR(50),
  MEMBER PROCEDURE DISPLAY
);

CREATE OR REPLACE TYPE t_abonnement AS OBJECT
(
  ref_abonnement           NUMBER,
  date_debut               DATE,
  type_abonnement          REF t_abonnement_type,
  MEMBER PROCEDURE DISPLAY
);

我想要做的就是创建DISPLAY声明的成员过程。 所以我是这样的:

    CREATE OR REPLACE TYPE BODY t_abonnement AS
  MEMBER PROCEDURE DISPLAY IS
    BEGIN
        /* SOME CODE */
        type_abonnement.display;
    END;
END;

我收到此错误

PLS-00536: Navigation through REF variables is not supported in PL/SQL.

那么我该如何处理PL / SQL语句中的REF? 谢谢

1 个答案:

答案 0 :(得分:1)

如@APC所述,不可能使用memberObject的{​​{1}}函数直接用于另一个函数,因为Oracle在SQL中支持它们,但在PL / SQL中不支持。

但是,如果我从另一个角度看待您的需求,我可以看到您正在尝试将一个对象中使用的过程简单地用于另一个对象。意味着如果我忘记了引用部分并创建了一个可以满足引用概念的方案,则应该“确定”。

这是可能的。是..!!!可以做到的。我在这里所做的唯一一件事就是使两个Object作为父子对象来实现REF。参见下面的演示:

referencing

测试我的父对象:

--Parent Object
CREATE OR REPLACE TYPE t_abonnement_type AS OBJECT
(
  ref_abonnement_type NUMBER,
  type_abonne         VARCHAR(50),
   MEMBER FUNCTION DISPLAY return varchar2
) NOT FINAL; 

-- Member Funtion Body
CREATE OR REPLACE TYPE BODY t_abonnement_type
AS
  MEMBER FUNCTION DISPLAY 
  return varchar2
  IS
  BEGIN
   return ('Hi');
  END DISPLAY;
END;

子对象实现引用概念

SQL> SELECT t_abonnement_type(1,'a').display() col from DUAL;  

    COL
    ---
    Hi

测试我的子对象以检查是否引用了父CREATE OR REPLACE TYPE t_abonnement under t_abonnement_type ( ref_abonnement NUMBER, date_debut DATE, MEMBER function V_DISPLAY return varchar2 ); --Member function CREATE OR REPLACE TYPE BODY t_abonnement AS MEMBER Function V_DISPLAY return varchar2 IS var varchar2(10); BEGIN var:= t_abonnement_type(1,'A').display(); --Calling Parent Member function here return('Called from Child Object -->'||var); END; END;

Member function

请注意,我没有在代码中使用重载功能,因为我觉得重载使这些内容无论是对于个人还是对编译器来说都更难以理解。