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

Posted

技术标签:

【中文标题】如何从 DB2 将所有列值作为 xml 属性返回?【英文标题】:How to return all column values as xml attributes from DB2? 【发布时间】:2015-10-01 15:07:37 【问题描述】:

所以通常使用* 表示您想要所有列或M.* 如果您想要别名为M 的表中的所有列,但这似乎在@987654324 中不起作用DB2 的 @ 函数。但是,按名称列出所需的列是可行的(我正在使用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,我会接受。

【问题讨论】:

【参考方案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>

【讨论】:

谢谢,但我特别想在 db2 中执行 xml,因为我在 R 中遇到了性能问题。 我明白了。但好奇什么性能问题?数据容量?内存?我经常建议不要使用超出其有限范围的 SQL DML, DDL 和数据检索。如果不是 R,请使用 Python、php、Java、C#、VB 或其他通用语言来创建像 XML 这样的文档,因为它们具有用于这些目的的扩展库。我发现一位程序员发送了一封带有 SQL 存储过程的电子邮件!哎呀! 这是内存。从那以后,我一直在解决这个问题,现在我正在做一些类似批处理查询的事情,并对批处理进行 xml 处理(实际上是 python 中的 JSON)。不过感谢您的回答!

以上是关于如何从 DB2 将所有列值作为 xml 属性返回?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 DB2 中表的列值更新 DB1 中表的列值?

如何从具有子句的 DB2 中获取 count(*) 总数?

DB2 SQL 如何从内部联接表返回 1 行

查询更新主键列值

如何使用 JpaRepository 从 xml 中的命名本机查询返回 Map 作为结果

PHP 返回 XML 字符串,并将值添加到属性缺失值