Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Hudson Cruz

ORA-00942: table or view does not exist

Recommended Posts

Pessoal bom dia.

 

Estou montando uma procedure e está aparecendo o erro ORA-00942: table or view does not exist. O erro é nas linhas onde realiza o insert

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 ); .

 

Agora se eu executar qualquer um dos insert fora da procedure, irá funcionar perfeitamente.

Se alguém puder me ajudar ficarei muito agradecido.

 

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 

   NULL; 

END; 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Confere o Owner do objeto.

Provavelmente voce esta fazendo assim:

 

Objeto: Fulano.TabelaX

 

Sessao: Fulano, resultado OK.

Procedure na sessao de Ciclano, resultado: ORA-00942: table or view does not exist.

 

Ciclano deve ter grant no objeto.

 

 

ORA-00942: table or view does not exist

Cause: The table or view entered does not exist, a synonym that is not allowed here was used, or a view was referenced where a table is required. Existing user tables and views can be listed by querying the data dictionary. Certain privileges may be required to access the table. If an application returned this message, the table the application tried to access does not exist in the database, or the application does not have access to it.

 

Action: Check each of the following:

 

* the spelling of the table or view name.

* that a view is not specified where a table is required.

* that an existing table or view name exists.

 

Contact the database administrator if the table needs to be created or if user or application privileges are required to access the table.

 

Also, if attempting to access a table or view in another schema, make certain the correct schema is referenced and that access to the object is granted.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se a tabela/objeto não é do OWNER do User duas coisas podem ser feitas.

 

Qualificar o objeto no DML

 

ex

 

SELECT *
FROM USUARIO2.TABELA

 

Criar um sinônimo (pode ser publico)

 

CREATE PUBLIC SYNONYM TABELA FOR USUARIO2.TABELA

 

Além do sinônimo o user que chama o Objeto deve ter o Gratnt especìfico (Select/Execute etc)

Compartilhar este post


Link para o post
Compartilhar em outros sites

O seu usuário de banco não deve estar com permissão de acesso as views V$ e DBA.

 

Att.

 

Renato

Oi Hudson,

 

Só complementando o Renato...

 

Como você está fazendo estes INSERTS/SELECTS dentro de um procedimento em PL/SQL, o OWNER do procedimento (levando em consideração que o procedimento foi criado com definer rights) deve ter privilégios DIRETOS de SELECT nos objetos V$ e DBA_, não adianta ter privilégios por ROLES (ex.: DBA), pois dentro de procedimentos PL/SQL as ROLES são desabilitadas.

 

Se o procedimento fosse criado com "invoker rights" (authid current_user), daí quem deveria ter o privilégio de SELECT nestes objetos (V$ e DBA_) é o usuário que chama o procedimento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.