首页 > 解决方案 > 如何将 PL/SQL 的输出(XML)存储在 oracle 表中

问题描述

我写了一个插入查询,它可以获取存储在表中的 XML 数据,如下所示:

INSERT INTO XmlTest VALUES (
  XMLType('<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <ID>1</ID>
  <RANK>1</RANK>
  <URBAN_AREA>Tokyo-Yokohama (Keihin)</URBAN_AREA>
  <COUNTRY>Japan</COUNTRY>
  <POPULATION>37126000</POPULATION>
 </ROW>
 </ROWSET>'
 ));

正在成功插入..存在的 XML 必须是从 PL/SQL 编写的代码的输出,即:

DECLARE
   l_refcursor SYS_REFCURSOR;
   l_xmltype XMLTYPE;
BEGIN
   OPEN l_refcursor FOR select id,
       rank,
       urban_area,
       country,
       population      
from eba_dp_demo_table where country='China'  and population>3500000;
l_xmltype := XMLTYPE(l_refcursor);
dbms_output.put_line(l_xmltype.getClobVal);

基本上,我试图将 PL/SQL 代码放在 XML 代码的位置有没有办法做到这一点..我无法实现它,如果有人能帮助我,那就太好了......

标签: xmldatabaseoracleplsqlstorage

解决方案


您可以使用XMLELEMENT从查询脚本中生成所需的 XML 标记。

CREATE TABLE EBA_DP_DEMO_TABLE
AS
SELECT 1 ID_,1 RANK_, 'Tokyo-Yokohama (Keihin)' AS URBAN_AREA , 'Japan' COUNTRY ,'37126000' POPULATION FROM DUAL
UNION ALL
SELECT 2 ID_,2 RANK_, 'Abidinpasa' AS URBAN_AREA , 'Turkey' COUNTRY ,'6666' POPULATION FROM DUAL;

DECLARE
   L_REFCURSOR   SYS_REFCURSOR;
   L_XMLTYPE     XMLTYPE;
BEGIN
   OPEN L_REFCURSOR FOR
      SELECT
            '<?xml version="1.0"?><ROWSET><ROW>'
             || ID
             || RANK
             || URBAN_AREA
             || COUNTRY
             || POPULATION
             || '</ROW></ROWSET>'
        FROM (SELECT XMLELEMENT ("ID", ID_) ID,
                     XMLELEMENT ("RANK", RANK_) RANK,
                     XMLELEMENT ("URBAN_AREA", URBAN_AREA) URBAN_AREA,
                     XMLELEMENT ("COUNTRY", COUNTRY) COUNTRY,
                     XMLELEMENT ("POPULATION", POPULATION) POPULATION
                FROM EBA_DP_DEMO_TABLE
               WHERE COUNTRY = 'Turkey');

   L_XMLTYPE := XMLTYPE (L_REFCURSOR);
   DBMS_OUTPUT.PUT_LINE (L_XMLTYPE.GETCLOBVAL);
END;

推荐阅读