create or replace FUNCTION fnc_26ai_default_password RETURN VARCHAR2 IS
    v_letras      VARCHAR2(52) := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    v_numeros     VARCHAR2(10) := '0123456789';
    v_especiais   VARCHAR2(20) := '@#$';
    v_senha       VARCHAR2(50);
    v_final       VARCHAR2(50);

    -- Função interna para embaralhar caracteres
    FUNCTION shuffle(p_str VARCHAR2) RETURN VARCHAR2 IS
        v_tmp VARCHAR2(200);
        v_idx PLS_INTEGER;
        v_src VARCHAR2(200) := p_str;
    BEGIN
        WHILE LENGTH(v_src) > 0 LOOP
            v_idx := DBMS_RANDOM.VALUE(1, LENGTH(v_src)+1);
            v_tmp := v_tmp || SUBSTR(v_src, v_idx, 1);
            v_src := SUBSTR(v_src, 1, v_idx-1) || SUBSTR(v_src, v_idx+1);
        END LOOP;
        RETURN v_tmp;
    END;
BEGIN
    DBMS_RANDOM.INITIALIZE(TRUNC(DBMS_RANDOM.VALUE * 100000));

    -- 4 letras
    FOR i IN 1..4 LOOP
        v_senha := v_senha || SUBSTR(v_letras, TRUNC(DBMS_RANDOM.VALUE(1, LENGTH(v_letras)+1)), 1);
    END LOOP;

    -- 2 números
    FOR i IN 1..2 LOOP
        v_senha := v_senha || SUBSTR(v_numeros, TRUNC(DBMS_RANDOM.VALUE(1, LENGTH(v_numeros)+1)), 1);
    END LOOP;

    -- 1 especial
    v_senha := v_senha || SUBSTR(v_especiais, TRUNC(DBMS_RANDOM.VALUE(1, LENGTH(v_especiais)+1)), 1);

    -- Embaralhar tudo
    v_final := shuffle(v_senha);

    RETURN v_final;
END;
/