1

Oracle 11g では、次のタイプがあります。

CREATE OR REPLACE TYPE "T_XMLTABLE" AS OBJECT (
 zeile NUMBER,
 spalte NUMBER,
 wert VARCHAR2(1000),
 xml NUMBER,
 link VARCHAR2(1000),
 target VARCHAR2(100),
 srt NUMBER,
 typ NUMBER,
 format VARCHAR2(100),
 uebersetzbar NUMBER,
 tooltip VARCHAR2(100),
 kommentar NUMBER,
 output NUMBER,

 CONSTRUCTOR FUNCTION t_xmltable(p_zeile        NUMBER,
                                 p_spalte       NUMBER,
                                 p_wert         VARCHAR2,
                                 p_xml          NUMBER,
                                 p_link         VARCHAR2 DEFAULT NULL,
                                 p_target       VARCHAR2 DEFAULT NULL,
                                 p_srt          NUMBER DEFAULT 0,
                                 p_typ          NUMBER DEFAULT 1,
                                 p_format       VARCHAR2 DEFAULT NULL,
                                 p_uebersetzbar NUMBER DEFAULT 0,
                                 p_tooltip      VARCHAR2 DEFAULT NULL,
                                 p_kommentar    NUMBER DEFAULT 0,
                                 p_output       NUMBER DEFAULT 7) RETURN SELF AS RESULT
)

CREATE OR REPLACE TYPE BODY t_xmltable AS
 CONSTRUCTOR FUNCTION t_xmltable(p_zeile        NUMBER,
                                 p_spalte       NUMBER,
                                 p_wert         VARCHAR2,
                                 p_xml          NUMBER,
                                 p_link         VARCHAR2 DEFAULT NULL,
                                 p_target       VARCHAR2 DEFAULT NULL,
                                 p_srt          NUMBER DEFAULT 0,
                                 p_typ          NUMBER DEFAULT 1,
                                 p_format       VARCHAR2 DEFAULT NULL,
                                 p_uebersetzbar NUMBER DEFAULT 0,
                                 p_tooltip      VARCHAR2 DEFAULT NULL,
                                 p_kommentar    NUMBER DEFAULT 0,
                                 p_output       NUMBER DEFAULT 7) RETURN SELF AS RESULT 

AS
     BEGIN
       self.zeile        := p_zeile;
       self.spalte       := p_spalte;
       self.wert         := p_wert;
       self.xml          := p_xml;
       self.link         := p_link;
       self.target       := p_target;
       self.srt          := p_srt;
       self.typ          := p_typ;
       self.format       := p_format;
       self.uebersetzbar := p_uebersetzbar;
       self.tooltip      := p_tooltip;
       self.kommentar    := p_kommentar;
       self.output       := p_output;
       RETURN;
     END;
    END;

ご覧のとおり、かなりの数のメンバーがあり、コンストラクターを介してデフォルト値で初期化されます。コンストラクターを取得する前に、型は次のように開始されました。

t_xmltable(zeile        => v_y,
           spalte       => v_x,
           wert         => 'someval',
           xml          => 1337,
           link         => NULL,
           target       => NULL,
           srt          => 0,
           typ          => 1,
           format       => NULL,
           uebersetzbar => 1,
           tooltip      => NULL,
           kommentar    => 0,
           output       => 7);

ここで、不必要なデフォルト値を取り除くためにコンストラクターを導入しました。しかし、これらのデフォルト値は名前付きパラメーターと組み合わせて使用​​できないようです。それらの快適さを失いたくないので、その型を使用するすべてのコードをリファクタリングするのはかなりの作業になります。

以下の作品:

DECLARE
  x t_xmltable;
BEGIN
  x := t_xmltable(1, 1, 'a', 1);
END;

次のものではありません:

DECLARE
  x t_xmltable;
BEGIN
  x := t_xmltable(zeile => 1, spalte => 1, wert => 'a', xml => 1);
END;

誰かが問題を解決するための独創的なアイデアを持っていますか?

4

2 に答える 2

4

エラーメッセージは何ですか?

コードは次のようにすべきではありません:

DECLARE
  x t_xmltable;
BEGIN
  x := t_xmltable(p_zeile => 1, p_spalte => 1, p_wert => 'a', p_xml => 1);
END;

(名前付きパラメーターごとに p_ 接頭辞付き)?

于 2013-10-02T16:04:43.243 に答える
2

名前付きパラメーターは、基礎となるオブジェクト フィールド名ではなく、コンストラクター内のパラメーター名と一致する必要があります。

DECLARE
  x t_xmltable;
BEGIN
  x := t_xmltable(p_zeile => 1, p_spalte => 1, p_wert => 'a', p_xml => 1);
END;
/

anonymous block completed

または、コンストラクターのパラメーター名からプレフィックスを削除しp_ます。それらは必要ありません。割り当て中に混乱することはありません。私は、それを好むと思う寄稿者を少なくとも 1 人思いつくことができます。

于 2013-10-02T16:05:05.910 に答える