如何在SQL Developer中将变量设置为等于空XML节点

时间:2016-10-10 21:52:48

标签: sql xml postgresql null

运行以下代码时,我收到'禁止NULL SELF参数的方法调度'错误'错误。我手动浏览了我的XML文件,发现'OtherLocation'有时是空白的。我注释掉与该节点关联的行并修复了错误。我正在使用一个包含事件信息的大型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进行更多研究后,我发现如果xml元素为空,它将返回null xmltype。有没有办法在尝试添加之前检查null?如果元素为空,那么我需要将''插入到相应的表中。

1 个答案:

答案 0 :(得分: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()尝试从null对象中提取值。