在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;
有人有一些巧妙的想法如何解决问题?
答案 0 :(得分:4)
错误信息是什么?
代码不应该是这样的:
DECLARE
x t_xmltable;
BEGIN
x := t_xmltable(p_zeile => 1, p_spalte => 1, p_wert => 'a', p_xml => 1);
END;
(每个命名参数都有p_前缀)?
答案 1 :(得分: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_
前缀 - 您不需要它们,在分配期间不会感到困惑。我能想到至少有一个我认为更喜欢的贡献者。