【问题标题】:SQL: Fetch value from XMLTYPESQL:从 XMLTYPE 中获取值
【发布时间】:2018-10-06 08:20:47
【问题描述】:

您能告诉我如何打印供应商站点值 1254 和 90。 它可以是 2 个或 3 个或更多站点,因此我需要打印所有站点。

声明

vendor_xml xmltype :=  
    xmltype( 
        '<VENDORLIST> 
            <VENDOR> 
                <VENDOR_NAME>Testvendorname</VENDOR_NAME> 
                <SITE>
                   <ERPSITEID>1254</ERPSITEID>
                </SITE>
                <SITE>
                   <ERPSITEID>90</ERPSITEID>
                </SITE>                   
            </VENDOR> 
        </VENDORLIST>'); 

vendor_name varchar2(100); 
vendor_site number(5); 

cursor cur_sites
IS
SELECT XMLCAST(XMLQUERY('/VENDORLIST/VENDOR/SITE/ERPSITEID' PASSING vendor_xml RETURNING CONTENT) AS number(5)) "REFERENCE"
FROM dual;

开始

FOR i IN cur_sites
LOOP  
   dbms_output.put_line('v-site    :  ' || i.reference); 
END LOOP;    

结束;

你能给点建议吗?

谢谢 佛法

【问题讨论】:

    标签: sql xml plsql


    【解决方案1】:

    你可以这样做:

    DECLARE
        vendor_xml   XMLTYPE := xmltype(
            '<VENDORLIST> 
                <VENDOR> 
                    <VENDOR_NAME>Testvendorname</VENDOR_NAME> 
                    <SITE>
                       <ERPSITEID>1254</ERPSITEID>
                    </SITE>
                    <SITE>
                       <ERPSITEID>90</ERPSITEID>
                    </SITE>
                </VENDOR> 
            </VENDORLIST>');
    
        CURSOR cur 
        IS 
        SELECT vendor_site
          FROM  XMLTABLE ( '*/VENDOR/SITE' 
                PASSING vendor_xml 
                COLUMNS vendor_site NUMBER PATH 'ERPSITEID' );
    
    BEGIN
        FOR i IN cur LOOP
            dbms_output.put_line('v-site: ' || i.vendor_site);
        END LOOP;
    END;
    /
    

    如果要考虑主从关系,可以这样:

    DECLARE
        vendor_xml   XMLTYPE := xmltype(
            '<VENDORLIST> 
                <VENDOR> 
                    <VENDOR_NAME>Testvendorname</VENDOR_NAME> 
                    <SITE>
                       <ERPSITEID>1254</ERPSITEID>
                    </SITE>
                    <SITE>
                       <ERPSITEID>90</ERPSITEID>
                    </SITE>
                </VENDOR> 
                <VENDOR> 
                    <VENDOR_NAME>Vendor2</VENDOR_NAME> 
                    <SITE>
                       <ERPSITEID>4711</ERPSITEID>
                    </SITE>
                    <SITE>
                       <ERPSITEID>123</ERPSITEID>
                    </SITE>
                </VENDOR> 
            </VENDORLIST>');
    
        CURSOR cur 
        IS 
        SELECT v.vendor_name, vs.vendor_site
          FROM  XMLTABLE ( '*/VENDOR' 
                PASSING vendor_xml 
                COLUMNS vendor_name VARCHAR2(100) PATH 'VENDOR_NAME'
                      , vendor_sites XMLTYPE PATH 'SITE') v
              , XMLTABLE ( '*' 
                PASSING v.vendor_sites 
                COLUMNS vendor_site NUMBER PATH 'ERPSITEID' ) vs
        ;
    BEGIN
        FOR i IN cur LOOP
            dbms_output.put_line('v-name: ' || i.vendor_name || ', v-site: ' || i.vendor_site);
        END LOOP;
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2013-07-06
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多