3 votes

Combien d'arguments COALESCE accepte-t-il ?

Je n'ai pas trouvé cela dans SO et j'ai pensé que cela pourrait valoir la peine de le trouver ici car la documentation d'oracle ne le précise pas.

http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm

6voto

Roger Points 1532

Testé sur 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

Donc, la réponse est 256

EDIT : Comme suggéré par Bob Duell :

SELECT func_id, name, minargs, maxargs 
FROM V$SQLFN_METADATA
WHERE name = 'COALESCE'

FUNC_ID NAME        MINARGS MAXARGS 
387     COALESCE    2       0   

:(

EDIT :

La limite sur 11.2.0.3 semble être de 65 535.

Le script ci-dessus ne fonctionnera pas avec autant d'arguments. Vous pouvez tester la limite en créant et en exécutant une très grande instruction SQL, avec un script comme celui ci-dessous.

--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;
/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X