我有以下代码:
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? 谢谢
答案 0 :(得分:1)
如@APC所述,不可能使用member
将Object
的{{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
请注意,我没有在代码中使用重载功能,因为我觉得重载使这些内容无论是对于个人还是对编译器来说都更难以理解。