金仓数据库KingbaseES xmlelement表达式使用技巧
关键字:
KingbaseES、xmlelement、xml、人大金仓
xml简介
xml指可扩展标记语言,被用来设计传输和存储数据。xml 数据类型可以被用来存储 xml 数据。它比直接在一个 text 域中存储 xml 数据的优势在于,它会检查输入值的结构是不是良好,并且有支持函数用于在其上执行类型安全的操作。使用这种数据类型要求在安装时用 configure --with-libxml 选项编译。
有一组函数和类函数的表达式可以用来从 SQL 数据产生 XML 内容。它们特别适合于将查询结果格式化成 XML 文档以便于在客户端应用中处理,例如:xmlcomment、xmlconcat、和xmlelement函数等。下文详细介绍xmlelement表达式的使用。
二、xmlelement表达式
2.1 功能
Xmlelement表达式的功能为使用给定名称、属性和内容产生一个 XML 元素。
2.2 语法
xmlelement(name name [, xmlattributes(value [AS attname] [, ... ])] [, content, ...])
参数详解:
- name:xml标签名称。
- xmlattributes():设置xml属性。
- value:属性值。
- attname:属性名。如果属性值是一个列引用,则不需要指定一个显式的属性名,在这种情况下列的名字将被默认用于属性的名字。在其他情况下,属性必须被给定一个显式名称。
- content:xml的内容。
2.3 使用
- 仅仅设置xml标签名称:
test=# SELECT xmlelement(name kes);
xmlelement
------------
<kes/>
(1 行记录)
- 设置xml的标签名和属性:
test=# SELECT xmlelement(name kes, xmlattributes('xyz' as bar));
xmlelement
------------------
<kes bar="xyz"/>
(1 行记录)
- 设置xml的标签名、属性和内容:
test=# SELECT xmlelement(name kes, xmlattributes(current_date as bar), 'cont', 'ent');
xmlelement
-------------------------------------
<kes bar="2023-09-06">content</kes>
(1 行记录)
- 不是合法 XML 名字的元素名和属性名将被逃逸,逃逸的方法是将违反的字符用序列_xHHHH_替换,其中HHHH是被替换字符的 Unicode 代码点的十六进制表示。例如:
test=# SELECT xmlelement(name "kes$bar", xmlattributes('xyz' as "a&b"));
xmlelement
----------------------------------
<kes_x0024_bar a_x0026_b="xyz"/>
(1 行记录)
- 如果属性值是一个列引用,则不需要指定一个显式的属性名,在这种情况下列的名字将被默认用于属性的名字。在其他情况下,属性必须被给定一个显式名称。因此这个例子是合法的:
test=# CREATE TABLE test (a int, b int);
CREATE TABLE
test=# insert into test values(1,2);
INSERT 0 1
test=# SELECT xmlelement(name test, xmlattributes(a, b)) FROM test;
xmlelement
---------------------
<test a="1" b="2"/>
(1 行记录)
但是下面这些不合法:
SELECT xmlelement(name test, xmlattributes('constant'), a, b) FROM test;
SELECT xmlelement(name test, xmlattributes(func(a, b))) FROM test;
- 如果指定了元素内容,它们将被根据其数据类型格式化。如果内容本身也是类型xml,就可以构建复杂的 XML 文档。例如:
test=# SELECT xmlelement(name kes, xmlattributes('xyz' as bar), xmlelement(name abc),xmlcomment('test'));
xmlelement
----------------------------------------
<kes bar="xyz"><abc/><!--test--></kes>
(1 行记录)
- 将数据表的内容使用xmlelement映射为xml数据。
create table emp (employee_id int, manager_id int,first_name VARCHAR2(4000),salary int);
insert into emp values(100,null,'Steven',24000);
insert into emp values(121,100,'Adam',8200);
insert into emp values(186,121,'Julia',3400);
test=# select XMLElement(name employee,XMLElement(name id,employee_id),XMLElement(name name,first_name),XMLElement( name salary,salary)) as "result" from emp;
result
----------------------------------------------------------------------------
<employee><id>100</id><name>Steven</name><salary>24000</salary></employee>
<employee><id>121</id><name>Adam</name><salary>8200</salary></employee>
<employee><id>186</id><name>Julia</name><salary>3400</salary></employee>
(3 行记录)




