如何将所有列值 return 作为 DB2 的 xml 属性?
How to return all column values as xml attributes from DB2?
所以通常会使用 *
来指示您想要所有列,或者如果您想要 table 中的所有列且别名 M
,则使用 M.*
,但是这似乎在 DB2
的 XMLATTRIBUTES
函数内部不起作用。但是,按名称列出所需的列是可行的(我正在使用 R
中的 RODBC
驱动程序):
qry <- "
SELECT XML2CLOB(
XMLELEMENT(NAME \"my_object\",
XMLATTRIBUTES(M.COLUMN1 AS \"column_1\", M.COLUMN2)
)) as xml
FROM MYTABLE M
fetch first 100 rows only
"
结果:
XML
1: <my_object column_1="1000002" COLUMN2="1"/>
2: <my_object column_1="1000003" COLUMN2="2"/>
3: <my_object column_1="1000004" COLUMN2="1"/>
4: <my_object column_1="1000005" COLUMN2="2"/>
5: <my_object column_1="1000006" COLUMN2="2"/>
...
我无法概括所有列,如以下查询所示:
qry <- "
SELECT XML2CLOB(
XMLELEMENT(NAME \"my_object\",
XMLATTRIBUTES(M.*)
)) as xml
FROM MYTABLE M
fetch first 100 rows only
"
结果:
V1
1: 42601 -104 [IBM][CLI Driver][DB2] SQL0104N An unexpected token "*" was found following "*". Expected tokens may include: "NEXTVAL CURRVAL". SQLSTATE=42601\r\n
2: [RODBC] ERROR: Could not SQLExecDirect '\nSELECT XML2CLOB(\n XMLELEMENT(NAME "claim",\n XMLATTRIBUTES(F.*)\n )) as xml\n FROM LRD.FEA F\n where F.CPU_STMP_DT_CEN = 20\n and F.CPU_STMP_DT_YR = 13\nfetch first 100 rows only\n'
我不确定 *
快捷方式是否在 XMLATTRIBUTES
中不受支持,或者我应该构建我自己的某种别名,将列名粘贴到 XMLATTRIBUTES
中,但是我不知道该怎么做。
此外,如果每个列名称值都是嵌套在 my_object
中的自己的 XMLELEMENT
,我会接受。
考虑让 R 直接处理 XML 文档的开发,而不是 DB2 特定函数。 SQL 被认为是一种特殊用途的语言,因此不是处理平面文件、动态呈现内容以及与其他 API 流畅连接的最佳选择。
您可以在下方使用 *
将简单的 select 查询导入数据框。然后遍历数据框的每一列作为新属性:
library(XML)
library(RODBC)
# ODBC DB CONNECTION
conn <-odbcDriverConnect('driver={DB2 Driver};host=hostname;
database=databasename; UID=username;PWD=password')
df <- sqlQuery(conn, "select * from tablename;")
close(conn)
# CREATE XML FILE
doc = newXMLDoc()
root = newXMLNode("Data", doc = doc)
# ADD NEW NODE WITH AN ATTRIBUTE
for (col in names(xmldf)) {
my_object = newXMLNode("my_object", attrs = c(column = col), parent=root)
}
print(doc)
<?xml version="1.0"?>
<Data>
<my_object column="first column"/>
<my_object column="second column"/>
<my_object column="third column"/>
</Data>
所以通常会使用 *
来指示您想要所有列,或者如果您想要 table 中的所有列且别名 M
,则使用 M.*
,但是这似乎在 DB2
的 XMLATTRIBUTES
函数内部不起作用。但是,按名称列出所需的列是可行的(我正在使用 R
中的 RODBC
驱动程序):
qry <- "
SELECT XML2CLOB(
XMLELEMENT(NAME \"my_object\",
XMLATTRIBUTES(M.COLUMN1 AS \"column_1\", M.COLUMN2)
)) as xml
FROM MYTABLE M
fetch first 100 rows only
"
结果:
XML
1: <my_object column_1="1000002" COLUMN2="1"/>
2: <my_object column_1="1000003" COLUMN2="2"/>
3: <my_object column_1="1000004" COLUMN2="1"/>
4: <my_object column_1="1000005" COLUMN2="2"/>
5: <my_object column_1="1000006" COLUMN2="2"/>
...
我无法概括所有列,如以下查询所示:
qry <- "
SELECT XML2CLOB(
XMLELEMENT(NAME \"my_object\",
XMLATTRIBUTES(M.*)
)) as xml
FROM MYTABLE M
fetch first 100 rows only
"
结果:
V1
1: 42601 -104 [IBM][CLI Driver][DB2] SQL0104N An unexpected token "*" was found following "*". Expected tokens may include: "NEXTVAL CURRVAL". SQLSTATE=42601\r\n
2: [RODBC] ERROR: Could not SQLExecDirect '\nSELECT XML2CLOB(\n XMLELEMENT(NAME "claim",\n XMLATTRIBUTES(F.*)\n )) as xml\n FROM LRD.FEA F\n where F.CPU_STMP_DT_CEN = 20\n and F.CPU_STMP_DT_YR = 13\nfetch first 100 rows only\n'
我不确定 *
快捷方式是否在 XMLATTRIBUTES
中不受支持,或者我应该构建我自己的某种别名,将列名粘贴到 XMLATTRIBUTES
中,但是我不知道该怎么做。
此外,如果每个列名称值都是嵌套在 my_object
中的自己的 XMLELEMENT
,我会接受。
考虑让 R 直接处理 XML 文档的开发,而不是 DB2 特定函数。 SQL 被认为是一种特殊用途的语言,因此不是处理平面文件、动态呈现内容以及与其他 API 流畅连接的最佳选择。
您可以在下方使用 *
将简单的 select 查询导入数据框。然后遍历数据框的每一列作为新属性:
library(XML)
library(RODBC)
# ODBC DB CONNECTION
conn <-odbcDriverConnect('driver={DB2 Driver};host=hostname;
database=databasename; UID=username;PWD=password')
df <- sqlQuery(conn, "select * from tablename;")
close(conn)
# CREATE XML FILE
doc = newXMLDoc()
root = newXMLNode("Data", doc = doc)
# ADD NEW NODE WITH AN ATTRIBUTE
for (col in names(xmldf)) {
my_object = newXMLNode("my_object", attrs = c(column = col), parent=root)
}
print(doc)
<?xml version="1.0"?>
<Data>
<my_object column="first column"/>
<my_object column="second column"/>
<my_object column="third column"/>
</Data>