我正在尝试在 Oracle 中创建一个对象方法,如下所示:
CREATE OR REPLACE TYPE BODY TheType AS
MEMBER FUNCTION getAtt RETURN VARCHAR2 IS
BEGIN
RETURN DEREF(SELF.Att).Att2;
END;
END;
/
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
PLS-00306: wrong number or types of arguments in call to 'DEREF'
Run Code Online (Sandbox Code Playgroud)
TheType 类型也声明如下:
PLS-00306: wrong number or types of arguments in call to 'DEREF'
Run Code Online (Sandbox Code Playgroud)
以及超类型的定义:
CREATE OR REPLACE TYPE TheType UNDER SuperType ();
/
...
ALTER TYPE TheType ADD ATTRIBUTE ( Att REF TheType ) CASCADE;
...
ALTER TYPE TheType
ADD MEMBER FUNCTION getAtt RETURN VARCHAR2
CASCADE;
Run Code Online (Sandbox Code Playgroud)
我给 DEREF 函数一个类型正确的 var,为什么会出现此错误?
如果我信任Oracle 文档,它应该可以工作
谢谢。
将 DEREF 转换为 SQL。例如
SQL> create or replace type supertype as object ( att2 varchar2(50) )
2 not final not instantiable;
3 /
Type created.
SQL> create or replace type thetype under supertype (
2 att ref thetype,
3 member function getatt return varchar2);
4 /
Type created.
SQL> show errors type thetype
No errors.
SQL> create or replace type body thetype as
2 member function getatt return varchar2 is
3 v_t thetype;
4 begin
5 select deref(self.att) into v_t from dual;
6 return v_t.att2;
7 end;
8 end;
9 /
Type body created.
SQL> show errors type body thetype
No errors.
SQL> create table thetypes of thetype;
Table created.
SQL> insert into thetypes values ('hi there', null);
1 row created.
SQL> set serverout on
SQL> declare
2 v_t thetype;
3 begin
4 select thetype(null, ref(a)) into v_t from thetypes a;
5 dbms_output.put_line(v_t.getatt);
6 end;
7 /
hi there
PL/SQL procedure successfully completed.
SQL>
Run Code Online (Sandbox Code Playgroud)