2013-10-02 59 views
1

在Oracle 11g中我有以下类型:调用带有默认值的PL/SQL构造函数和命名参数

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

为什么要关闭问题而不是接受答案? (Przemyslaw在我之前略微到达了那里,讨厌* 8-)这不是一个只是一个错字的问题,国际海事组织,虽然我认为它可以说是接近... –

+0

嗯,你说得对。接受@ Przemyslaw的答案。再次感谢 – Joshua

+0

@Alex Poole Yea,我不认为回答本网站上的问题会给他们带来这个“刺激”因素:)每次我发送答案时我都想知道是否有人在我之前没有发过一个;)约书亚,谢谢。 –

回答

2

什么是错误信息?

不宜代码是这样的:

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

(与每个命名参数P_前缀)?

1

你命名的参数必须在构造函数中,不匹配的参数名称底层对象的字段名称:

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_前缀 - 你不需要他们,它在分配过程中不会被混淆。我可以想到至少有一个我认为更喜欢的贡献者。