0

我创建了一个自己的类型,构造函数重载:

CREATE TYPE foo_type AS OBJECT(
       foo_type INTEGER,
       foo_number NUMBER(28, 28),
       foo_varchar2 VARCHAR2(4000 CHAR),

       CONSTRUCTOR FUNCTION foo_type (data NUMBER) RETURN SELF AS RESULT,
       CONSTRUCTOR FUNCTION foo_type (data VARCHAR2) RETURN SELF AS RESULT
)

CREATE TYPE BODY foo_type AS
  CONSTRUCTOR FUNCTION foo_type (data NUMBER) RETURN SELF AS RESULT
  IS
  BEGIN
       foo_type := 1;
       foo_number := data;
       return;
  END;

  CONSTRUCTOR FUNCTION foo (data VARCHAR2) RETURN SELF AS RESULT
  IS
  BEGIN
       foo_type := 2;
       foo_varchar2 := data;
       return;
  END;
END;

虽然只要它有效,我就不会超载:

insert into test_table (field) values ( foo_type(1, 2.2, 'bar') )

但是当我编写构造函数时,它根本不起作用:

insert into test_table (field) values ( foo_type(2.2) )

或者

insert into test_table (field) values ( foo_type('bar') )

此时 oracle 说:“ORA-06553:太多声明 'foo_type' 匹配此调用”,因此:

insert into test_table (field) values ( foo_type(foo_varchar2 => 'bar') )

说:“ORA-009007:缺少右括号”。

我应该改变它的工作原理?

谢谢。

4

1 回答 1

4

如果我更正语法错误,以便对象的声明和主体编译

  • 您不能拥有与对象类型同名的成员变量
  • 对象主体中的第二个构造函数不需要命名foo_type——foo构造函数总是使用对象的名称。

给我留下类似的东西

CREATE TYPE foo_type AS OBJECT(
       foo_int INTEGER,
       foo_number NUMBER(28, 28),
       foo_varchar2 VARCHAR2(4000 CHAR),
       CONSTRUCTOR FUNCTION foo_type (data NUMBER) RETURN SELF AS RESULT,
       CONSTRUCTOR FUNCTION foo_type (data VARCHAR2) RETURN SELF AS RESULT
);
/

 CREATE OR REPLACE TYPE BODY foo_type AS
   CONSTRUCTOR FUNCTION foo_type (data NUMBER) RETURN SELF AS RESULT
   IS
   BEGIN
        foo_int := 1;
        foo_number := data;
        return;
   END;
   CONSTRUCTOR FUNCTION foo_type (data VARCHAR2) RETURN SELF AS RESULT
   IS
   BEGIN
        foo_int := 2;
        foo_varchar2 := data;
        return;
   END;
 END;

如果我更改为传递一个对NUMBER(28,28)列有效的数字(2.2 不是),重载就可以了

SQL> ed
Wrote file afiedt.buf

  1   declare
  2     l_foo foo_type;
  3   begin
  4     l_foo := foo_type( 0.2 );
  5     dbms_output.put_line( l_foo.foo_int );
  6     l_foo := foo_type( 'bar' );
  7     dbms_output.put_line( l_foo.foo_int );
  8*  end;
SQL> /
1
2

PL/SQL procedure successfully completed.

或插入表格

SQL> create table test_table( foo_column foo_type );

Table created.

SQL> insert into test_table values( foo_type( 0.2 ) );

1 row created.

SQL> insert into test_table values( foo_type( 'bar' ) );

1 row created.

在我看来,当您尝试在示例中分配 2.2 的值时,您真的想foo_number成为一个特别的人似乎不太可能。NUMBER(28, 28)如果您的实际对象类型是这样声明的,那么您的默认构造函数将失败。

于 2013-02-19T16:43:01.617 回答