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;
誰かが問題を解決するための独創的なアイデアを持っていますか?