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') )

この時点で、オラクルは次のように述べています。「ORA-06553:この呼び出しに一致する宣言'foo_type'が多すぎます」。

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

「ORA-009007:右括弧がありません」と言います。

動作するように何を変更すればよいですか?

ありがとう。

4

1 に答える 1

4

オブジェクトの宣言と本体がコンパイルされるように構文エラーを修正すると

  • オブジェクトタイプと同じ名前のメンバー変数を持つことはできません
  • オブジェクト本体の2番目のコンストラクターには名前を付ける必要はあり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 に答える