在Oracle 9i中是否有另一个用于wm_concat的命令?

10 浏览
0 Comments

在Oracle 9i中是否有另一个用于wm_concat的命令?

我有一个包含部门ID、员工姓名和入职日期的表格。我想要获取在特定部门特定日期入职的所有员工的列表。然而,wm_concat 不起作用。

0
0 Comments

在Oracle 9i中,wm_concat函数用于将多个行的值连接为一个字符串。然而,wm_concat在Oracle 9i之后的版本被弃用了,因此在某些情况下需要寻找替代方法。

一种替代方法是使用UDAG函数。以下是在9i中声明UDAG函数的示例代码:

CREATE OR REPLACE TYPE t_string_agg AS OBJECT
(
  g_string  VARCHAR2(32767),
  STATIC FUNCTION ODCIAggregateInitialize(sctx  IN OUT  t_string_agg)
    RETURN NUMBER,
  MEMBER FUNCTION ODCIAggregateIterate(self   IN OUT  t_string_agg,
                                       value  IN      VARCHAR2 )
     RETURN NUMBER,
  MEMBER FUNCTION ODCIAggregateTerminate(self         IN   t_string_agg,
                                         returnValue  OUT  VARCHAR2,
                                         flags        IN   NUMBER)
    RETURN NUMBER,
  MEMBER FUNCTION ODCIAggregateMerge(self  IN OUT  t_string_agg,
                                     ctx2  IN      t_string_agg)
    RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY t_string_agg IS
  STATIC FUNCTION ODCIAggregateInitialize(sctx  IN OUT  t_string_agg)
    RETURN NUMBER IS
  BEGIN
    sctx := t_string_agg(NULL);
    RETURN ODCIConst.Success;
  END;
  MEMBER FUNCTION ODCIAggregateIterate(self   IN OUT  t_string_agg,
                                       value  IN      VARCHAR2 )
    RETURN NUMBER IS
  BEGIN
    SELF.g_string := self.g_string || ',' || value;
    RETURN ODCIConst.Success;
  END;
  MEMBER FUNCTION ODCIAggregateTerminate(self         IN   t_string_agg,
                                         returnValue  OUT  VARCHAR2,
                                         flags        IN   NUMBER)
    RETURN NUMBER IS
  BEGIN
    returnValue := RTRIM(LTRIM(SELF.g_string, ','), ',');
    RETURN ODCIConst.Success;
  END;
  MEMBER FUNCTION ODCIAggregateMerge(self  IN OUT  t_string_agg,
                                     ctx2  IN      t_string_agg)
    RETURN NUMBER IS
  BEGIN
    SELF.g_string := SELF.g_string || ',' || ctx2.g_string;
    RETURN ODCIConst.Success;
  END;
END;
/
CREATE OR REPLACE FUNCTION string_agg (p_input VARCHAR2)
RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING t_string_agg;

使用UDAG函数的示例代码如下:

SELECT deptno, string_agg(ename) AS employees
FROM   emp
GROUP BY deptno;

另外,还可以尝试从Stack Overflow上的一个问题中找到另一种方法,但是该方法在处理大表时可能会比较慢。

0
0 Comments

在Oracle 9i中没有提供wm_concat函数,因此需要寻找其他的解决方法。可以尝试使用wmsys.wm_concat函数(适用于Oracle 10g及更高版本),或者使用listagg函数(适用于Oracle 11g及更高版本)来达到相同的目的。

0
0 Comments

在Oracle 9i中,存在一个问题:是否有另一个命令可以替代wm_concat?

根据这个链接的内容,可以得知wm_concat不被支持。

WM_CONCAT是一个未被Oracle支持的未记录函数,因此不适用于用户应用程序。

但是,在上述链接中提到可以使用一个用户定义的聚合函数来替代wm_concat。

0