Sql 如何在Oracle中以xml元素名的形式提供列值
我有两张桌子。我正在尝试加入它们,并通过在oracle中使用SQL/XMLSQLX来准备XML。这里的问题是XMLELEMENT函数将硬编码值作为元素名,但我希望将这些名称作为列数据。可能吗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
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这样的元素!