› Fóruns › Banco de dados Oracle › Listar processos do banco. › Listar processos do banco.
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