4

次のようにOracleでオブジェクトメソッドを作成しようとしています:

CREATE OR REPLACE TYPE BODY TheType AS
    MEMBER FUNCTION getAtt RETURN VARCHAR2 IS
    BEGIN
        RETURN DEREF(SELF.Att).Att2;
    END;
END;
/

しかし、次のエラーが発生しました:

PLS-00306: wrong number or types of arguments in call to 'DEREF'

また、タイプ TheType は次のように宣言されます。

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;

そして Supertype の定義:

CREATE OR REPLACE TYPE SuperType AS OBJECT ( Att2 VARCHAR2(50) )
NOT FINAL NOT INSTANTIABLE;
/

DEREF 関数に正しい型の var を指定しましたが、なぜこのエラーが発生するのですか?

Oracleのドキュメントを信頼すればうまくいくはずです

ありがとう。

4

3 に答える 3

4

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>
于 2012-12-26T17:30:48.137 に答える
0

REFは、変数、パラメーター、フィールド、または属性として宣言できます。

DECLARE
  emp         employee_typ;
  emp_ref REF employee_typ;  -- creating one more type with REF
BEGIN
  SELECT REF(e) INTO emp_ref FROM employee_tab e WHERE e.employee_id = 370;
  UPDATE employee_tab e 
    SET e.address = address_typ('NIZAM', 'Hyd', 'AP', '465876')
    WHERE REF(e) = emp_ref;
END;

REFそして、私はDEREFオブジェクトタイプを作成するときに考えたり働いたりしません。オブジェクトのインスタンス値を返すためのものです。

于 2012-12-26T10:14:31.890 に答える
0

問題を絞り込むためのいくつかのアイデア:

  1. DEREFをから分離し.Att2、スクリプトのどの部分が気に入らないかをテストします。また
  2. attスタンドアロンの pl/sql を使用して型を試し、何かが返されるかどうかを確認してください。
  3. それがうまくいくかどうかがわかる場合はDEREF、; また
  4. REF(TheType.Att2)スタンドアロンの pl/sql で型作成の外で動作するかどうかを確認します。

最初のインスタンスでは問題がないように見えますが、私はあなたに同意します。

幸運を。

于 2012-12-26T09:58:37.300 に答える