sql - getting name and value from xmltype attribute in oracle -
description
hello, have problem extracting attribute names , values xmltype value in oracle. basically, have table, let's tablea
, has xmltype column, let's call tablea_config
. values in tablea_config
have structure this: <tableaconfig someattribute1="value1" someattribute2="value2" someattribute3="value3" />
. number of attributes , names may vary , not known beforehand. need (for each row) create new xmlelement called tableaconfiglist
, contains xmlelements called tableaconfig
, each of has 2 attributes: name
, value
. now, number of tableaconfig
nodes must equal number of attributes in tablea_config
column, , each holds name of corresponding attribute in name
attribute , value in value
attribute.
example
from:
<tableaconfig someattribute1="value1" someattribute2="value2" someattribute3="value3" />
i should get:
<tableaconfiglist> <tableaconfig name="someattribute1" value="value1"/> <tableaconfig name="someattribute2" value="value2"/> <tableaconfig name="someattribute3" value="value3"/> </tableaconfiglist>
what tried
i came idea create xmltable
tablea_config
column value , in create 2 columns, can later select. looks (it fragment of bigger query):
select xmlelement("tableaconfiglist", (select xmlagg( xmlelement("tableaconfig", xmlattributes( tmp."attr_name" "name", tmp."attr_text" "value" ) ) ) xmltable('/tableaconfig/@*' passing tablea.tablea_config columns "attr_name" varchar(30) path 'name()', "attr_text" varchar(30) path 'text()' ) tmp ) ) dual
but get:
<tableaconfiglist> <tableaconfig name="someattribute1"></tableaconfig> <tableaconfig name="someattribute2"></tableaconfig> <tableaconfig name="someattribute3"></tableaconfig> </tableaconfiglist>
there no value
. however, if remove name
xmlattributes
shows up. from:
select xmlelement("tableaconfiglist", (select xmlagg( xmlelement("tableaconfig", xmlattributes( tmp."attr_text" "value" ) ) ) xmltable('/tableaconfig/@*' passing tablea.tablea_config columns "attr_name" varchar(30) path 'name()', "attr_text" varchar(30) path 'text()' ) tmp ) ) dual
i get:
<tableaconfiglist> <tableaconfig value="value1"></tableaconfig> <tableaconfig value="value2"></tableaconfig> <tableaconfig value="value3"></tableaconfig> </tableaconfiglist>
i thought maybe, reason, there can 1 attribute created way, if add new 1 hardcoding it, shows in result, this:
select xmlelement("tableaconfiglist", (select xmlagg( xmlelement("tableaconfig", xmlattributes( tmp."attr_text" "value", 'testvalue' "testattribute" ) ) ) xmltable('/tableaconfig/@*' passing tablea.tablea_config columns "attr_name" varchar(30) path 'name()', "attr_text" varchar(30) path 'text()' ) tmp ) ) dual
result:
<tableaconfiglist> <tableaconfig value="value1" testattribute="testvalue"></tableaconfig> <tableaconfig value="value2" testattribute="testvalue"></tableaconfig> <tableaconfig value="value3" testattribute="testvalue"></tableaconfig> </tableaconfiglist>
putting in xmlattributes
both columns , hardcoded 1 gives me name
, testattribute
, no value
.
could tell me because miss terribly obvious, bug or doing wrong. pretty new oracle , pl/sql , appreciate help. thanks!
you there first attempt. while evaluating xpath, when inside attribute list /tableaconfig/@*
, don't need text()
value of attribute inside it. @ attribute level using "dot" .
current node sufficient.
so try -
select xmlelement("tableaconfiglist", (select xmlagg( xmlelement("tableaconfig", xmlattributes( tmp."attr_name" "name", tmp."attr_text" "value" ) ) ) xmltable('/tableaconfig/@*' passing tablea.tablea_config columns "attr_name" varchar(30) path 'name()', "attr_text" varchar(30) path '.' ) tmp ) ) dual
the difference first attempt xpath of value
attribute.
Comments
Post a Comment