COALESCE函数接受多少参数?

3
1个回答

6

测试通过 Oracle 10g。

DECLARE
    cur SYS_REFCURSOR;
    vQuery VARCHAR2(32000) := 'SELECT COALESCE(:NULLS) FROM dual';
    vNulls VARCHAR2(32000) := '1, 1';
    i PLS_INTEGER := 2;
BEGIN
    LOOP
        OPEN cur FOR REPLACE (vQuery, ':NULLS', vNulls);
        CLOSE cur;

        i := i + 1;
        vNulls := vNulls || ', 1';
    END LOOP;
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE(i || ' ' || SQLERRM);
END;

256 ORA-00939: too many arguments for function

因此,答案是256 编辑:正如Bob Duell建议的那样:
SELECT func_id, name, minargs, maxargs 
FROM V$SQLFN_METADATA
WHERE name = 'COALESCE'

FUNC_ID NAME        MINARGS MAXARGS 
387     COALESCE    2       0   

:(

编辑:

11.2.0.3版本的限制似乎为65,535。

上述脚本将无法处理那么多参数。您可以通过创建并运行非常大的SQL语句来测试限制,使用以下类似于下面的脚本。

--Create a COALESCE with 65,536 functions.
--It will fail with: ORA-00939: too many arguments for function
--But if you remove the last argument it will work, at least on 11.2.0.3.
--WARNING: Sending this much data through DBMS_OUTPUT may freeze some tools.
begin
    dbms_output.put_line('select coalesce(');
    for i in 1 .. 6553 loop
        dbms_output.put_line('1,2,3,4,5,6,7,8,9,0,');
    end loop;
    dbms_output.put_line('1,2,3,4,5,6');
    dbms_output.put_line(') from dual;');
end;
/

+1 鼓励创造性;另请参阅 http://docs.oracle.com/cd/B28359_01/server.111/b28320/dynviews_3063.htm#REFRN30501 - BellevueBob
不嵌套函数调用也不是问题,所以如果需要超过256个函数,也是可以的。 - David Aldridge
在11.2.0.3版本中,该函数最多可以接受65535个参数。如果需要,您仍然可以嵌套使用该函数。 - Jon Heller
@jonearles 谢谢,你是怎么发现的?我写了上面的脚本,因为我不知道该如何查找它。 - Roger
@Roger 我手动完成了。 (不,我没有花费几天时间测试这个 - 我猜测限制是2的幂次方。)希望你不介意我在你的答案中添加了一个示例脚本,而不是创建另一个帖子并拆分答案。 - Jon Heller
@jonearles 没有问题,非常感谢您的改进(尽管这不是一个非常好的问题):)。 - Roger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接