使用默认值和命名参数调用PL / SQL构造函数

时间:2013-10-02 15:51:05

标签: oracle object plsql syntax-error

在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;

有人有一些巧妙的想法如何解决问题?

2 个答案:

答案 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_前缀 - 您不需要它们,在分配期间不会感到困惑。我能想到至少有一个我认为更喜欢的贡献者。