2013-12-23 40 views
0

错误在确定的行中时是否有可能发生异常?是否可以在PL/SQL中对精确行进行异常处理?

例如,这是我的代码片段:

l_XMLvalue := l_xmltype.extract('/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/QUANTITY/VALUE/text()').getStringVal(); 
dbms_output.put_line('QUANTITY: '||l_XMLvalue); 
l_XMLdocument_id := l_xmltype.extract('/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID/text()').getStringVal(); 
dbms_output.put_line('DOCUMENT ID:' ||l_XMLdocument_id); 
l_XMLdoc_release := l_xmltype.extract('/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/USERAREA/DOCUMENTRELEASE/text()').getStringVal(); 
dbms_output.put_line('DOCUMENT RELEASE:' ||l_XMLdoc_release); 
l_XMLlinenum := l_xmltype.extract('/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/LINENUM/text()').getStringVal(); 
dbms_output.put_line('LINE NUMBER:' ||l_XMLlinenum); 
l_XMLsch_lnum := l_xmltype.extract('/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/SCHLINENUM/text()').getStringVal(); 
dbms_output.put_line('SCHIPMENT LINE NUMBER:' ||l_XMLsch_lnum); 

当函数提取正在试图获取价值,会有NULL,该程序将停止。这是可能的例外:

WHEN SELF_IS_NULL THEN 
dbms_output.put_line('There is a problem with empty values in XML file'); 

这是我想做的事情是检查在哪一行发生错误,并写异常其准确值是错误

回答

0

尝试创建函数extract函数的包装函数,并确定一个EXCEPTION SELF_IS_NULL并使用RAISE SELF_IS_NULL;如果它返回NULL。

dbms_output.put_line(SQLERRM||chr(10)||dbms_utility.format_error_backtrace);

请把这个在您的异常块。它打印从它起源(线NO)

0

一种方式来完成这个堆栈跟踪是使用检查点变量,类似以下内容:

BEGIN 
    strXMLelement := '/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/QUANTITY/VALUE/text()'; 
    l_XMLvalue := l_xmltype.extract(strXMLelement).getStringVal(); 
    dbms_output.put_line('QUANTITY: '||l_XMLvalue); 

    strXMLelement := '/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID/text()'; 
    l_XMLdocument_id := l_xmltype.extract(strXMLelement).getStringVal(); 
    dbms_output.put_line('DOCUMENT ID:' ||l_XMLdocument_id); 

    strXMLelement := '/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/USERAREA/DOCUMENTRELEASE/text()'; 
    l_XMLdoc_release := l_xmltype.extract(strXMLelement).getStringVal(); 
    dbms_output.put_line('DOCUMENT RELEASE:' ||l_XMLdoc_release); 

    strXMLelement := '/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/LINENUM/text()'; 
    l_XMLlinenum := l_xmltype.extract(strXMLelement).getStringVal(); 
    dbms_output.put_line('LINE NUMBER:' ||l_XMLlinenum); 

    strXMLelement := '/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/SCHLINENUM/text()'; 
    l_XMLsch_lnum := l_xmltype.extract(strXMLelement).getStringVal(); 
    dbms_output.put_line('SCHIPMENT LINE NUMBER:' ||l_XMLsch_lnum); 
EXCEPTION 
    WHEN SELF_IS_NULL THEN 
    DBMS_OUTPUT.PUT_LINE('Error extracting ' || strXMLelement || ' : ' || 
         'SQLCODE=' || SQLCODE || ' SQLERRM=' || SQLERRM); 
END; 

分享和享受。

相关问题