2010-09-08 48 views
1

这里是我的对象DEF:为什么我会得到PLS - 00382?

CREATE OR REPLACE TYPE FALCON.contacts AS OBJECT (phone   VARCHAR2(50) 
    ,phoneusage  VARCHAR2(25) 
    ,phonetype  VARCHAR2(25) 
    ,email   VARCHAR2(150) 
    ,phoneext  VARCHAR2(25) 
    ,anytext   VARCHAR2(250)) 

下面是表DEF:

CREATE OR REPLACE TYPE FALCON.contacttbl AS TABLE OF contacts 

这里是我的管道函数

FUNCTION get_pcontacts(p_conttbl IN xmltypedefs_spec.conttbl) 
RETURN falcon.contacttbl 
PIPELINED 
IS 
    l_contact falcon.contacts; 
BEGIN 
    FOR n IN 1 .. p_conttbl.count 
    LOOP 
     PIPE ROW(**falcon.contacts**(p_conttbl(n).phone, p_conttbl(n).phoneusage,    p_conttbl(n).phonetype, p_conttbl(n).email, p_conttbl(n).phoneext, p_conttbl(n).anytext)); 
    END LOOP; 
    RETURN; 
END get_pcontacts; 

我得到的错误,当我调用表功能:

FUNCTION get_pidxml(p_pidrec xmltypedefs_spec.pidtyp) 
RETURN CLOB 
IS 
    l_tmprec     CLOB; 
    l_pxml     xmltype; 
    l_bxml     xmltype; 
    l_pcontacts    xmltypedefs_spec.conttbl := p_pidrec.personalcont; 
    l_bcontacts    xmltypedefs_spec.conttbl := p_pidrec.businesscont; 

BEGIN 

--  l_pxml := get_contacts(p_pidrec, 'p'); 
--  l_bxml := get_contacts(p_pidrec, 'b'); 

SELECT xmlelement("pid" 
        ,xmlforest(p_pidrec.setid AS "setID" 
           ,p_pidrec.patidexternal AS "patientIDExternal" 
           ,p_pidrec.patientid AS "patientID" 
           ,p_pidrec.patintasgnauth AS "patientIDInterAssignAuthority" 
           ,p_pidrec.patinttypecd AS "patientIDInternalIDTypeCode" 
           ,p_pidrec.patidalternate1 AS "patientIDAlernate1" 
           ,p_pidrec.patlastname AS "patientLastName" 
           ,p_pidrec.patfirstname AS "patientFirstName" 
           ,p_pidrec.patmiddleinit AS "patientMiddleInitial" 
           ,p_pidrec.patsuffix AS "patientSuffix" 
           ,p_pidrec.patprefix AS "patientPrefix" 
           ,p_pidrec.degree AS "degree" 
           ,p_pidrec.familyname AS "familyName" 
           ,p_pidrec.givenname AS "givenName" 
           ,p_pidrec.mothermaidname AS "mothersMaidenName" 
           ,p_pidrec.dob AS "dateOfBirth" 
           ,p_pidrec.adminsex AS "administrativeSex" 
           ,p_pidrec.patientalias AS "patientAlias" 
           ,p_pidrec.race AS "race" 
           ,p_pidrec.racetext AS "raceText" 
           ,p_pidrec.pataddr1 AS "patientAddress1" 
           ,p_pidrec.pataddr2 AS "patientAddress2" 
           ,p_pidrec.patcity AS "patientCity" 
           ,p_pidrec.patstate AS "patientState" 
           ,p_pidrec.patzip AS "patientZip" 
           ,p_pidrec.countrycode AS "countryCode" 
           ,p_pidrec.addresstype AS "addressType" 
           ,p_pidrec.othgeodesig AS "otherGeographicDesignation" 
           ,p_pidrec.county AS "county" 

           ,(SELECT xmlagg(xmlelement("contactInfo", 
              xmlforest(phone AS "phoneNumber", 
                 phoneusage AS "telecomUseCode", 
                 phonetype AS "telecomequiptype", 
                 email AS "email", 
                 phoneext AS "phonenumberextension", 
                 anytext AS "anytext"))) 
           FROM TABLE(**get_pcontacts(l_pcontacts**))) AS "personalContact" 
+0

你有一个复杂的实现。如果将get_pcontacts()函数独立调用,而没有使用所有XML函数,get_pcontacts()函数是否可以正常工作? – APC 2010-09-09 09:30:58

回答

0

http://pls-00382.ora-code.com/

PLS-00382:表达式类型错误

的因为我不知道xmltypedefs_spec.conttbl是如何定义的呢,我删除从管道函数的输入参数,只是有它产生假数据飞:

CREATE OR REPLACE FUNCTION get_contacts 
    RETURN contacttbl PIPELINED 
IS 
    -- converts some structure to pipe of contacts 
BEGIN 
    FOR n IN 1 .. 5 LOOP 
     PIPE ROW( 
     contact( 
      '877-867-5309', 
      'Work', 
      'Cell', 
      '[email protected]', 
      n, 
      'WTF?' 
     ) 
    ); 
    END LOOP; 
    RETURN; 
END get_contacts; 

的查询现在执行没有错误:

SELECT 
    xmlagg(
     xmlelement("contactInfo", 
      xmlforest(
       phone AS "phoneNumber", 
       phoneusage AS "telecomUseCode", 
       phonetype AS "telecomequiptype", 
       email AS "email", 
       phoneext AS "phonenumberextension", 
       anytext AS "anytext" 
      ) 
     ) 
    ) 
FROM 
    TABLE(get_contacts()) 

这告诉我可能xmltypedefs_spec.conttbl有问题,也许在SQL语句中使用集合类型?不确定。如果将xmltypedefs_spec.pidtyp更改为使用falcon.contacttbl而不是xmltypedefs_spec.conttbl,会怎么样?似乎你有一个包类型和一个对象类型正在做同样的事情?

0

xmltypedefs_spec定义对应于XML元素的记录类型。这些记录类型用于碎化和构建XML。最初,XML不使用重复元素,但现在必须。我试图获取一个xmltypedefs_spec.pidtyp表,并使用流水线函数从关联表中返回'行'的数据。正是以这种方式,我想发送数组记录的行来构建xml。

相关问题