如何将所有列值作为xml属性从DB2返回?

时间:2015-10-01 15:07:37

标签: sql xml r db2 rodbc

因此,如果您希望表格中的所有列都使用别名*,那么通常使用M.*表示您想要所有列或M,但这并不是似乎在XMLATTRIBUTES的{​​{1}}函数内部工作。但是,按名称列出所需的列有效(我使用DB2中的RODBC驱动程序):

R

结果:

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内的XMLELEMENT,我会接受。

1 个答案:

答案 0 :(得分:1)

考虑让R直接处理XML文档的开发而不是DB2特定的函数。 SQL被认为是一种特殊用途语言,因此不是处理平面文件,动态呈现内容以及与其他API流畅连接的最佳选择。

下面您可以使用*将简单的选择查询导入数据框。然后迭代数据框的每一列作为新属性:

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>