5

我正在编写一些使用 WM_CONCAT 函数的程序。当我运行此查询时:

SELECT WM_CONCAT(DISTINCT employee_id)
FROM   employee
WHERE  ROWNUM < 20;

它工作正常。当我尝试在包函数或过程中编译相对相同的查询时,会产生以下错误:PL/SQL: ORA-30482: DISTINCT option not allowed for this function

FUNCTION fetch_raw_data_by_range
RETURN VARCHAR2 IS

    v_some_string VARCHAR2(32000);

BEGIN

    SELECT WM_CONCAT(DISTINCT employee_id)
    INTO   v_some_string
    FROM   employee
    WHERE  ROWNUM < 20;

    RETURN v_some_string;

END;

我意识到 WM_CONCAT 不受官方支持,但有人可以解释为什么它可以作为 DISTINCT 的独立查询工作,而不是在包中编译吗?

4

2 回答 2

6

问题是 WM_CONCAT 是写在 pl/sql 上的存储过程。

有一个未解决的错误 #9323679:PL/SQL CALLING A USER DEFINED AGGREGRATE FUNCTION WITH DISTINCT 失败 ORA-30482。

此类问题的解决方法是使用动态 sql。

因此,如果您将查询包装在

EXECUTE IMMEDIATE '<your_query>';

然后它应该工作。

但正如 OldProgrammer 已经建议的那样,你最好完全避免使用这个 WM_CONCAT。

于 2013-10-24T23:50:19.107 回答
4

PL/SQL 不允许您distinct在聚合函数中使用,并且这个问题表明 SQL 引擎和 PL/SQL 引擎不使用相同的解析器。

此问题的解决方案之一是使用子查询,如下所示,

SELECT WM_CONCAT(employee_id)
INTO   v_some_string
FROM   (select DISTINCT employee_id
        FROM   employee)
WHERE  ROWNUM < 20;

另一种解决方案是按照 Nagh 的建议使用动态 SQL,

FUNCTION fetch_raw_data_by_range
RETURN VARCHAR2 IS

    v_some_string VARCHAR2(32000);
    v_sql VARCHAR2(200);

BEGIN

    v_sql :='SELECT WM_CONCAT(DISTINCT employee_id)
             FROM   employee
             WHERE  ROWNUM < 20';

    execute immediate v_sql INTO v_some_string;
    RETURN v_some_string;
END;
于 2013-10-25T02:33:11.737 回答