[LightDB兼容增强]支持xmlagg().getclobval()
支持的版本:自LightDB 23.4
背景:
Oracle数据库中,xmlagg()返回一个xml document实例,支持xmlagg().getclobval()进行链式调用,此调用方式符合直觉,方便用户进行逻辑表达。
解决方案:
LightDB当前并不支持基于对象实例的链式调用,为尽量减少对内核的改动,同时又支持此链式调用,我们对函数调用逻辑在语法层面做了改写,主要思路如下
a().b() -> b(a())
当LightDB运行在oracle模式的时候,我们将xmlagg().getclobval()改成写了getclobval(xmlagg())
使用案例:
1, create database
create database oradb with lightdb_syntax_compatible_type oracle;
2, xmlagg example
\c oradb CREATE TABLE aggt ( id NUMBER, first_name VARCHAR2(50), last_name VARCHAR2(100), age INT ); INSERT INTO aggt (id, first_name, last_name,age) VALUES (3, 'Bob1','B', 11); INSERT INTO aggt (id, first_name, last_name,age) VALUES (4, 'Bob2','B', 12); INSERT INTO aggt (id, first_name, last_name,age) VALUES (5, 'Bob3','B', 13); INSERT INTO aggt (id, first_name, last_name,age) VALUES (1, 'Alice1', 'A', 9); INSERT INTO aggt (id, first_name, last_name,age) VALUES (2, 'Alice2', 'A', 10); INSERT INTO aggt (id, first_name, last_name,age) VALUES (21, 'Alice2', 'A', 8); INSERT INTO aggt (id, first_name, last_name,age) VALUES (6, 'Charlie','C', 14); INSERT INTO aggt (id, first_name, last_name,age) VALUES (7, 'David1','D', 15); INSERT INTO aggt (id, first_name, last_name,age) VALUES (8, 'David2','D', 16); INSERT INTO aggt (id, first_name, last_name,age) VALUES (9, 'David3','D', 17); INSERT INTO aggt (id, first_name, last_name,age) VALUES (10, 'David4','D', 18); SELECT RTRIM( XMLAGG(xmlparse(content aggt.id ||',' WELLFORMED) ORDER BY aggt.id).getclobval(),',') as "id_list" FROM aggt WHERE 1 = 1;
注意:
当前仅支持此链式调用