Pular para o conteúdo

Fóruns Banco de dados Oracle Listar processos do banco. Listar processos do banco.

#97348
rwarstat
Participante

    Hudson,

    Faça o quê o Ramasine falou: ativa o trace e analisa onde ele está parando.

    A questão de que fora da procedure funciona e dentro dela não é uma questão de como o engine do PL/SQL trata as permissões. Basicamente o PL/SQL não enxerga as roles. Já faz algum tempo que rolou por aqui uma discussão dessas, acho até que a dúvida era minha.

    Modifiquei a tua exception para gravar a mensagem de erro em uma tabela. O campo para gravar a mensagem deve ser varchar2(4000).

    create or replace
    PROCEDURE SP_AJUSTA_PARAMETROS (P_RETORNO VARCHAR2) IS

    V_HOUR VARCHAR2(10);
    V_STATE VARCHAR2(10);
    V_COUNT VARCHAR2(100);

    BEGIN

    INSERT INTO TB_AJUSTA_PARAMETRO VALUE ( SELECT * FROM V$PARAMETER );
    INSERT INTO TB_AJUSTA_INSTANCIA VALUE ( SELECT * FROM V$INSTANCE );
    INSERT INTO TB_AJUSTA_HIST_ACTIVE VALUE ( SELECT * FROM DBA_HIST_ACTIVE_SESS_HISTORY );

    FOR R_HIST IN (
    SELECT TO_CHAR(TRUNC((SAMPLE_TIME), 'HH'), 'HH24:MI') AS "HOUR",
    STATE,
    COUNT(*)/360 AS "COUNT"
    FROM (
    SELECT SAMPLE_TIME,
    SAMPLE_ID,
    CASE WHEN SESSION_STATE = 'ON CPU' THEN 'CPU'
    WHEN SESSION_STATE = 'WAITING' AND WAIT_CLASS IN('User I/O') THEN 'IO'
    WHEN SESSION_STATE = 'WAITING' AND WAIT_CLASS IN('Cluster') THEN 'CLUSTER'
    ELSE 'WAIT'
    END STATE
    FROM TB_AJUSTA_HIST_ACTIVE
    WHERE SESSION_TYPE IN('FOREGROUND')
    AND SAMPLE_TIME BETWEEN TRUNC(SYSDATE, 'HH') -25/24
    AND TRUNC(SYSDATE, 'HH') -1/24
    )
    GROUP BY TRUNC((SAMPLE_TIME), 'HH'), STATE
    ORDER BY TRUNC((SAMPLE_TIME), 'HH')
    )
    LOOP

    V_HOUR          := R_HIST."HOUR";
    V_STATE         := R_HIST.STATE;
    V_COUNT         := R_HIST."COUNT";
    

    END LOOP;

    COMMIT;

    EXCEPTION
    WHEN OTHERS THEN
    insert into tabela_log values (sqlerrm);

    END;

    Abraço,
    Roberto