繁体   English   中英

如何使用xmlagg function

[英]how to use xmlagg function

这是供参考的表格

CREATE TABLE XX_EMPLOYEES

(

EMP_ID NUMBER NOT NULL,

EMP_FIRST_NAME VARCHAR2(250) NOT NULL,

EMP_MIDDLE_NAME VARCHAR2(250) NOT NULL,

EMP_LAST_NAME VARCHAR2(250) NOT NULL,

Hired_Date DATE NOT NULL,

Country VARCHAR2(250) NOT NULL,

Salary NUMBER NOT NULL

);



INSERT ALL

INTO XX_EMPLOYEES (EMP_ID, EMP_FIRST_NAME, EMP_MIDDLE_NAME, EMP_LAST_NAME, Hired_Date, Country, Salary) VALUES (1,'Tomm','Jef','Adam','01-Jan-2016','JORDAN',1000)

INTO XX_EMPLOYEES (EMP_ID, EMP_FIRST_NAME, EMP_MIDDLE_NAME, EMP_LAST_NAME, Hired_Date, Country, Salary) VALUES (2,'Mohammed','Ahmed','Mahmoud','15-Jul-2009','UAE',900)

INTO XX_EMPLOYEES (EMP_ID, EMP_FIRST_NAME, EMP_MIDDLE_NAME, EMP_LAST_NAME, Hired_Date, Country, Salary) VALUES (4,'Ali','Ahmad','Mahmoud','07-Jul-2000','UK',1200)

INTO XX_EMPLOYEES (EMP_ID, EMP_FIRST_NAME, EMP_MIDDLE_NAME, EMP_LAST_NAME, Hired_Date, Country, Salary) VALUES (10,'Basel','Jamal','Saeed','10-Apr-2001','UAE',1000)



SELECT * FROM dual;

我想使用 XMLAGG function 在一行中返回员工的完整信息,由#$# 连接

我已经使用循环 function 来执行它和 RTRIM,但我需要使用 XMLAGG。 可能吗?

结果应该是这样的:

1,Tomm,Jef,Adam,01-JAN-2016,JORDAN,1000 #$# 2,Mohammed,Ahmed,Mahmoud,15-JUL-2009,UAE,900 #$# 4,Ali,Ahmad,Mahmoud,07-JUL-2000,UK,1200 #$# 10,Basel,Jamal,Saeed,10-APR-2001,UAE,1000

Statement processed.

如果最终结果不超过 4000 个字符, listagg使用起来更简单:

SQL> WITH
  2     one_emp
  3     AS
  4        (SELECT    emp_id
  5                || ','
  6                || emp_first_name
  7                || ','
  8                || emp_middle_name
  9                || ','
 10                || emp_last_name
 11                || ','
 12                || hired_date
 13                || ','
 14                || country
 15                || ','
 16                || salary AS one_employee
 17           FROM xx_employees)
 18  SELECT LISTAGG (one_employee, '#$#') WITHIN GROUP (ORDER BY NULL) AS result
 19    FROM one_emp;

RESULT
--------------------------------------------------------------------------------
1,Tomm,Jef,Adam,01.01.16,JORDAN,1000#$#10,Basel,Jamal,Saeed,10.04.01,UAE,1000#$#
2,Mohammed,Ahmed,Mahmoud,15.07.09,UAE,900#$#4,Ali,Ahmad,Mahmoud,07.07.00,UK,1200

如果结果超过 4000 个字符(可能是,如果涉及到很多员工)或者您只想使用xmlagg ,那么

SQL> WITH
  2     one_emp
  3     AS
  4        (SELECT    emp_id
  5                || ','
  6                || emp_first_name
  7                || ','
  8                || emp_middle_name
  9                || ','
 10                || emp_last_name
 11                || ','
 12                || hired_date
 13                || ','
 14                || country
 15                || ','
 16                || salary AS one_employee
 17           FROM xx_employees)
 18  SELECT RTRIM (
 19            XMLAGG (XMLELEMENT (e, one_employee || '#$#') ORDER BY NULL).EXTRACT (
 20               '//text()'),
 21            '#$#') AS result
 22    FROM one_emp;

RESULT
--------------------------------------------------------------------------------
1,Tomm,Jef,Adam,01.01.16,JORDAN,1000#$#2,Mohammed,Ahmed,Mahmoud,15.07.09,UAE,900
#$#4,Ali,Ahmad,Mahmoud,07.07.00,UK,1200#$#10,Basel,Jamal,Saeed,10.04.01,UAE,1000


SQL>

将该代码转换为 function 并不难:

SQL> CREATE OR REPLACE FUNCTION f_test
  2     RETURN CLOB
  3  IS
  4     retval  CLOB;
  5  BEGIN
  6     WITH
  7        one_emp
  8        AS
  9           (SELECT    emp_id
 10                   || ','
 11                   || emp_first_name
 12                   || ','
 13                   || emp_middle_name
 14                   || ','
 15                   || emp_last_name
 16                   || ','
 17                   || hired_date
 18                   || ','
 19                   || country
 20                   || ','
 21                   || salary AS one_employee
 22              FROM xx_employees)
 23     SELECT LISTAGG (one_employee, '#$#') WITHIN GROUP (ORDER BY NULL)
 24       INTO retval
 25       FROM one_emp;
 26
 27     RETURN retval;
 28  END;
 29  /

Function created.

让我们尝试一下:

SQL> select f_test from dual;

F_TEST
--------------------------------------------------------------------------------
1,Tomm,Jef,Adam,01.01.16,JORDAN,1000#$#10,Basel,Jamal,Saeed,10.04.01,UAE,1000#$#
2,Mohammed,Ahmed,Mahmoud,15.07.09,UAE,900#$#4,Ali,Ahmad,Mahmoud,07.07.00,UK,1200


SQL>

没有 CTE 和 RTRIM:

SQL> SELECT XMLAGG (XMLELEMENT (
  2                    e,
  3                       emp_id
  4                    || ','
  5                    || emp_first_name
  6                    || ','
  7                    || emp_middle_name
  8                    || ','
  9                    || emp_last_name
 10                    || ','
 11                    || hired_date
 12                    || ','
 13                    || country
 14                    || ','
 15                    || salary
 16                    || '#$#')
 17                 ORDER BY NULL).EXTRACT ('//text()') AS result
 18    FROM xx_employees;

RESULT
--------------------------------------------------------------------------------
1,Tomm,Jef,Adam,01.01.16,JORDAN,1000#$#2,Mohammed,Ahmed,Mahmoud,15.07.09,UAE,900
#$#4,Ali,Ahmad,Mahmoud,07.07.00,UK,1200#$#10,Basel,Jamal,Saeed,10.04.01,UAE,1000
#$#


SQL>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM