[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;

  

 注意:

  当前仅支持此链式调用

  

posted on 2023-12-05 10:23  aodb  阅读(60)  评论(0编辑  收藏  举报