2016-10-10 31 views
0

运行下面的代码时,我得到'NULL上的方法分配SELF参数不允许'错误。我手动检查了我的XML文件,发现'OtherLocation'有时是空白的。我注释了与该节点关联的行,并修复了该错误。我正在处理一个包含事件信息的大型XML文件。一些事件提供了信息,而其他事件则没有。如何在SQL Developer中设置变量等于空的XML节点

我需要包含信息,如果它在那里,并将变量设置为'',如果不是。

我该怎么做?

WHILE l_xml.existsNode('/ResultOfEvent/Items/Event[' || v_count || ']') = 1 LOOP 

    l_eventid := l_xml.extract('/ResultOfEvent/Items/Event[' || v_count || ']/EventId/text()').getStringVal(); 
    l_eventname := l_xml.extract('/ResultOfEvent/Items/Event[' || v_count || ']/EventName/text()').getStringVal(); 
    l_organizationid := l_xml.extract('/ResultOfEvent/Items/Event[' || v_count || ']/OrganizationId/text()').getStringVal(); 
    l_organizationname := l_xml.extract('/ResultOfEvent/Items/Event[' || v_count || ']/OrganizationName/text()').getStringVal(); 
    l_description := l_xml.extract('/ResultOfEvent/Items/Event[' || v_count || ']/Description/text()').getStringVal(); 
    --l_otherlocation := l_xml.extract('/ResultOfEvent/Items/Eventt[' || v_count || ']/OtherLocation/text()').getStringVal(); 
    insert into xml_test values(l_eventid, l_eventname, l_organizationid, l_organizationname, l_otherlocation, l_description); 

    v_count := v_count + 1; 
    END LOOP; 

编辑

在上xml.extract做更多的研究,我发现,它会返回一个空的XMLType如果XML元素为空。有没有办法在尝试添加之前检查null?如果元素为空,那么我需要将''插入到相应的表中。

回答

0

好了一段时间后,我终于能够想出一个工作解决方案。下面更改的代码不会产生错误。

WHILE l_xml.existsNode('//ResultOfEvent/Items/Event[' || v_count || ']') = 1 LOOP 
    l_eventid := l_xml.extract('//ResultOfEvent/Items/Event[' || v_count || ']/EventId/text()').getStringVal(); 
    l_eventname := l_xml.extract('//ResultOfEvent/Items/Event[' || v_count || ']/EventName/text()').getStringVal(); 
    l_organizationid := l_xml.extract('//ResultOfEvent/Items/Event[' || v_count || ']/OrganizationId/text()').getStringVal(); 
    l_organizationname := l_xml.extract('//ResultOfEvent/Items/Event[' || v_count || ']/OrganizationName/text()').getStringVal(); 

    v_otherlocation := l_xml.extract('//ResultOfEvent/Items/Event[' || v_count || ']/OtherLocation/text()'); 
    if v_otherlocation IS NULL then 
     l_otherlocation := ' '; 
    else 
     l_otherlocation := v_otherlocation.getStringVal(); 
    end if; 

    l_description := l_xml.extract('//ResultOfEvent/Items/Event[' || v_count || ']/Description/text()').getStringVal(); 
    insert into XMLPROCESSEDTABLE values(l_eventid, l_eventname, l_organizationid, l_organizationname, l_otherlocation, l_description); 
    v_count := v_count + 1; 
END LOOP; 

创建一个等于xmltype的新变量v_otherlocation是解决问题的方法。我得到的错误是因为getStringVal()。如果l_xml.extract返回null,则getStringVal()试图从空对象中提取值。