Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle中以xml元素名的形式提供列值_Sql_Xml_Oracle_Oracle11g - Fatal编程技术网

Sql 如何在Oracle中以xml元素名的形式提供列值

Sql 如何在Oracle中以xml元素名的形式提供列值,sql,xml,oracle,oracle11g,Sql,Xml,Oracle,Oracle11g,我有两张桌子。我正在尝试加入它们,并通过在oracle中使用SQL/XMLSQLX来准备XML。这里的问题是XMLELEMENT函数将硬编码值作为元素名,但我希望将这些名称作为列数据。可能吗 create table PRODUCTEDIT ( PRODUCTEDIT_NUM NUMBER(12) primary key, API_NAME VARCHAR2(255) ); create table PRODUCTEDITPARAMETER ( PRODUCTEDIT_NUM

我有两张桌子。我正在尝试加入它们,并通过在oracle中使用SQL/XMLSQLX来准备XML。这里的问题是XMLELEMENT函数将硬编码值作为元素名,但我希望将这些名称作为列数据。可能吗

create table PRODUCTEDIT
(
PRODUCTEDIT_NUM NUMBER(12) primary key,  
API_NAME        VARCHAR2(255)
);

create table PRODUCTEDITPARAMETER
(
PRODUCTEDIT_NUM NUMBER(12) not null,
PARAMETER_SEQ   NUMBER(9) not null,
PARAMETER_VALUE VARCHAR2(4000),
CONSTRAINT fk_producteditparameter
FOREIGN KEY (PRODUCTEDIT_NUM )
REFERENCES PRODUCTEDIT(PRODUCTEDIT_NUM )
);
第一个表中有2条记录

PRODUCTEDIT_NUM         Api_Name
1                       ModifyProd
2                       CreateProd
第二个表中的记录:

PRODUCTEDIT_NUM       PARAMETER_SEQ     PARAMETER_VALUE 
1                        1                    10
1                        2                    Data
1                        3                    1
1                        4                    Data1
1                        5                    1
2                        1                    11
2                        2                    Voice
2                        3                    1
现在,我想获得如下所示的XMLOUTPUT:

<?xml version='1.0'?>
<ModifyProd>
    <1>10</1>
    <2>Data</2>
    <3>1</3>
    <4>Data1</4>
    <5>1</5>
</ModifyProd>
<CreateProd>
    <1>11</1>
    <2>Voice</2>
    <3>1</3>    
</CreateProd>

我想你是在找这个:

WITH t AS 
    (SELECT 'foo' AS ELEMENT_NAME, 'bar' AS ELEMENT_CONTENT FROM dual)
SELECT XMLELEMENT(EVALNAME ELEMENT_NAME, ELEMENT_CONTENT)
FROM t;

<foo>bar</foo>
根据其他输入进行更新

您的结果不是格式良好的XML。XML文档必须只有一个根元素。因此,您可以请求几个XML文档,然后可以执行以下操作:

SELECT 
    XMLELEMENT(
        EVALNAME Api_Name, 
        XMLAGG(XMLELEMENT(EVALNAME parameter_seq, e.parameter_value) ORDER BY parameter_seq)
    ) AS xml_result
FROM PRODUCTEDITPARAMETER e
    JOIN PRODUCTEDIT d USING (productedit_num)
GROUP BY productedit_num, Api_Name;

<ModifyProd><1>10</1><2>Data</2><3>1</3><4>Data1</4><5>1</5></ModifyProd>
<CreateProd><1>11</1><2>Voice</2><3>1</3></CreateProd>
或者,如果需要单个XML,则必须用另一个元素将其括起来,例如

SELECT 
    XMLELEMENT("Products",  
        XMLAGG(
            XMLELEMENT(
                EVALNAME Api_Name, 
                XMLAGG(XMLELEMENT(EVALNAME parameter_seq, e.parameter_value) ORDER BY parameter_seq)
            )
        ) 
    ) AS xml_result
FROM PRODUCTEDITPARAMETER e
    JOIN PRODUCTEDIT d USING (productedit_num)
GROUP BY productedit_num, Api_Name;

<Products><ModifyProd><1>10</1><2>Data</2><3>1</3><4>Data1</4><5>1</5></ModifyProd><CreateProd><1>11</1><2>Voice</2><3>1</3></CreateProd></Products>

我想你是在找这个:

WITH t AS 
    (SELECT 'foo' AS ELEMENT_NAME, 'bar' AS ELEMENT_CONTENT FROM dual)
SELECT XMLELEMENT(EVALNAME ELEMENT_NAME, ELEMENT_CONTENT)
FROM t;

<foo>bar</foo>
根据其他输入进行更新

您的结果不是格式良好的XML。XML文档必须只有一个根元素。因此,您可以请求几个XML文档,然后可以执行以下操作:

SELECT 
    XMLELEMENT(
        EVALNAME Api_Name, 
        XMLAGG(XMLELEMENT(EVALNAME parameter_seq, e.parameter_value) ORDER BY parameter_seq)
    ) AS xml_result
FROM PRODUCTEDITPARAMETER e
    JOIN PRODUCTEDIT d USING (productedit_num)
GROUP BY productedit_num, Api_Name;

<ModifyProd><1>10</1><2>Data</2><3>1</3><4>Data1</4><5>1</5></ModifyProd>
<CreateProd><1>11</1><2>Voice</2><3>1</3></CreateProd>
或者,如果需要单个XML,则必须用另一个元素将其括起来,例如

SELECT 
    XMLELEMENT("Products",  
        XMLAGG(
            XMLELEMENT(
                EVALNAME Api_Name, 
                XMLAGG(XMLELEMENT(EVALNAME parameter_seq, e.parameter_value) ORDER BY parameter_seq)
            )
        ) 
    ) AS xml_result
FROM PRODUCTEDITPARAMETER e
    JOIN PRODUCTEDIT d USING (productedit_num)
GROUP BY productedit_num, Api_Name;

<Products><ModifyProd><1>10</1><2>Data</2><3>1</3><4>Data1</4><5>1</5></ModifyProd><CreateProd><1>11</1><2>Voice</2><3>1</3></CreateProd></Products>

如果我了解您的需求,另一个解决方案是:

WITH t AS
       (    SELECT LEVEL col1, 'test' || LEVEL col2
              FROM DUAL
        CONNECT BY LEVEL < 10)
SELECT XMLSERIALIZE (DOCUMENT (xmltype (CURSOR (SELECT col1, col2 FROM t))) INDENT SIZE = 0)
  FROM DUAL;
然后,可以使用XSD根据需要转换输出


如果我了解您的需求,希望它能帮助您找到另一种解决方案:

WITH t AS
       (    SELECT LEVEL col1, 'test' || LEVEL col2
              FROM DUAL
        CONNECT BY LEVEL < 10)
SELECT XMLSERIALIZE (DOCUMENT (xmltype (CURSOR (SELECT col1, col2 FROM t))) INDENT SIZE = 0)
  FROM DUAL;
然后,可以使用XSD根据需要转换输出


希望有帮助

请编辑您的问题以提供更多信息-表格结构、预期输出、您迄今为止尝试的内容以及为什么不正确…@AlexPoole是正确的。。。我们需要更多关于所需内容的详细信息。您的XML有问题,请参阅:XML命名规则元素名称必须以字母或下划线开头。也就是说,不允许使用像10这样的元素!请编辑您的问题以提供更多信息-表结构、预期输出、您迄今为止尝试的内容以及为什么不正确…@AlexPoole是正确的。。。我们需要更多关于所需内容的详细信息。您的XML有问题,请参阅:XML命名规则元素名称必须以字母或下划线开头。也就是说,不允许使用像10这样的元素!