Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
员工表的记录在每个部门中保留一行。因此,您可以使用聚合功能以及按部门分组。在Oracle SQL中创建逗号分隔字符串的聚合函数是listag,但您当然可以编写自己的。LSTAGG完全按照我的要求执行,但它返回一个VARCHAR。我的数据太长,因此需要返回C_Sql_Oracle_Function_Oracle11g - Fatal编程技术网

员工表的记录在每个部门中保留一行。因此,您可以使用聚合功能以及按部门分组。在Oracle SQL中创建逗号分隔字符串的聚合函数是listag,但您当然可以编写自己的。LSTAGG完全按照我的要求执行,但它返回一个VARCHAR。我的数据太长,因此需要返回C

员工表的记录在每个部门中保留一行。因此,您可以使用聚合功能以及按部门分组。在Oracle SQL中创建逗号分隔字符串的聚合函数是listag,但您当然可以编写自己的。LSTAGG完全按照我的要求执行,但它返回一个VARCHAR。我的数据太长,因此需要返回C,sql,oracle,function,oracle11g,Sql,Oracle,Function,Oracle11g,员工表的记录在每个部门中保留一行。因此,您可以使用聚合功能以及按部门分组。在Oracle SQL中创建逗号分隔字符串的聚合函数是listag,但您当然可以编写自己的。LSTAGG完全按照我的要求执行,但它返回一个VARCHAR。我的数据太长,因此需要返回CLOB select * from v$version; BANNER ---------------------------------------------------------------------------- Oracle D


员工表的记录在每个部门中保留一行。因此,您可以使用聚合功能以及
按部门分组
。在Oracle SQL中创建逗号分隔字符串的聚合函数是
listag
,但您当然可以编写自己的。LSTAGG完全按照我的要求执行,但它返回一个VARCHAR。我的数据太长,因此需要返回CLOB
select * from v$version;

BANNER
----------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

I know there are numerous ways of aggregating strings.
My needs are somewhat unique of please do not suggest alternate approaches.
I believe the following should work but it does not
CREATE OR REPLACE TYPE t_clob_agg_comma AS OBJECT
(
  g_string  clob,
  STATIC FUNCTION ODCIAggregateInitialize(sctx  IN OUT  t_clob_agg_comma)
    RETURN NUMBER,
  MEMBER FUNCTION ODCIAggregateIterate(self   IN OUT  t_clob_agg_comma,
                                       value  IN      VARCHAR2 )
     RETURN NUMBER,
  MEMBER FUNCTION ODCIAggregateTerminate(self         IN   t_clob_agg_comma,
                                         returnValue  OUT  VARCHAR2,
                                         flags        IN   NUMBER)
    RETURN NUMBER,
  MEMBER FUNCTION ODCIAggregateTerminate(self         IN   t_clob_agg_comma,
                                         returnValue  OUT  CLOB,
                                         flags        IN   NUMBER)
    RETURN NUMBER,
  MEMBER FUNCTION ODCIAggregateMerge(self  IN OUT  t_clob_agg_comma,
                                     ctx2  IN      t_clob_agg_comma)
    RETURN NUMBER
);
/
show errors
CREATE OR REPLACE TYPE BODY t_clob_agg_comma IS
  STATIC FUNCTION ODCIAggregateInitialize(sctx  IN OUT  t_clob_agg_comma)
    RETURN NUMBER IS
  BEGIN
    sctx := t_clob_agg_comma(NULL);
    RETURN ODCIConst.Success;
  END;
  MEMBER FUNCTION ODCIAggregateIterate(self   IN OUT  t_clob_agg_comma,
                                       value  IN      VARCHAR2)
    RETURN NUMBER IS
  BEGIN
    SELF.g_string := self.g_string || ',' || value;
    RETURN ODCIConst.Success;
  END;
  MEMBER FUNCTION ODCIAggregateTerminate(self         IN   t_clob_agg_comma,
                                         returnValue  OUT  VARCHAR2,
                                         flags        IN   NUMBER)
    RETURN NUMBER IS
  BEGIN
    returnValue := RTRIM(LTRIM(SELF.g_string, ','), ',');
    RETURN ODCIConst.Success;
  END;
  MEMBER FUNCTION ODCIAggregateTerminate(self         IN   t_clob_agg_comma,
                                         returnValue  OUT  CLOB,
                                         flags        IN   NUMBER)
    RETURN NUMBER IS
  BEGIN
    returnValue := RTRIM(LTRIM(SELF.g_string, ','), ',');
    RETURN ODCIConst.Success;
  END;
  MEMBER FUNCTION ODCIAggregateMerge(self  IN OUT  t_clob_agg_comma,
                                     ctx2  IN      t_clob_agg_comma)
    RETURN NUMBER IS
  BEGIN
    SELF.g_string := SELF.g_string || ',' || ctx2.g_string;
    RETURN ODCIConst.Success;
  END;
END;
/
show error
CREATE OR REPLACE FUNCTION clob_agg (p_input VARCHAR2)
RETURN clob
PARALLEL_ENABLE AGGREGATE USING t_clob_agg_comma;
/
SHOW ERRORS
SELECT department_id, clob_agg(last_name) over(order by last_name)  AS employees
FROM   demo.employee
group by department_id;

--SELECT department_id, clob_agg(last_name) over(order by last_name)  AS employees                             *
--ERROR at line 1:
--ORA-00979: not a GROUP BY expression
SELECT department_id, clob_agg(last_name) within group order by last_name  AS employees
FROM   demo.employee
group by department_id;
SELECT department_id, clob_agg(last_name) over(partition by department_id)  AS employees
FROM   demo.employee
group by department_id;

--SELECT department_id, clob_agg(last_name) within group order by last_name  AS employees                                    --                                                 *
--ERROR at line 1:
--ORA-00923: FROM keyword not found where expected
SELECT department_id, clob_agg(last_name) over(partition by department_id order by last_name)  AS employees
FROM   demo.employee;
SELECT department_id, clob_agg(last_name) over(partition by department_id order by last_name)  AS employees
FROM   demo.employee
group by department_id;
--SELECT department_id, clob_agg(last_name) over(partition by department_id order by last_name)  AS
--                               *
--ERROR at line 1:
--ORA-00979: not a GROUP BY expression
SELECT clob_agg(last_name)   AS employees
FROM   demo.employee
group by department_id;
SELECT department_id, clob_agg(last_name)  AS employees
FROM   demo.employee
group by department_id;
--does not sort, does not return department_id
SELECT clob_agg(last_name)   AS employees
FROM   demo.employee
group by department_id;
--does not sort
SELECT department_id, clob_agg(last_name)  AS employees
FROM   demo.employee
group by department_id;
select name, salary from employee;
select avg(salary) from employee;
select department, avg(salary) from employee group by department;
select name, salary, avg(salary) over () from employee;
select name, salary, avg(salary) over (partition by department) from employee;
select department, avg(salary), min(avg(salary)) over ()
from employee 
group by department;