martes, 16 de diciembre de 2008

ORA-00942 La tabla o vista no existe (pero sí existe)

Este error nos ha salido a muchos y generalmente se presenta cuando realmente la tabla o vista no existe en el esquema en el que la queremos usar.

Pero otras veces se genera porque no se han dado los permisos necesarios hacia la tabla o vista, o porque estamos intentando referenciar la tabla sin su esquema (cuando pertenece a otro) y el motor de base de datos se confunde si hay otro objeto en la base de datos con el mismo nombre.

Sin embargo, aunque la tabla exista y aunque se tengan los permisos necesarios para acceder a ella y se use el nombre del esquema al que pertenece, todavía existe la posibilidad de que nos salga el error ORA-00942. Resulta que si los permisos sobre la tabla o vista son concedidos a un rol al que pertenece el usuario con el que necesitamos accederla, es posible ejecutar query's normalmente. Pero si estos query's se van a ejecutar dentro de un procedimiento almacenado, nos vamos a encontrar con ORA-00942.

Qué pasa?
Pues no sé si sea un bug en el RDBMS, o esa sea su forma de administrar los privilegios o tal vez es por razones de seguridad, pero para poder acceder a una tabla o vista desde un procedimiento almacenado, el usuario debe haber adquirido los privilegios directamente y no a través de un rol.

13 comentarios:

Rubén dijo...

Cual es la solucion, estoy programando con Oracle ADF
y tengo este problem, ya los publique, tengo los EO y sigue el error ORA-00942: la tabla o vista no existe

Oscar dijo...

Hola Rubén.
Pero esto te pasa en la ejecución de un procedimiento almacenado? Porque eso fue lo que me sucedió a mí.
Lo que tuve que hacer fue asignarle los permisos directamente al usuario con el que se iban a ejecutar las consultas y no por rol.

Eduardo Náquira dijo...

Oscar, yo también tengo el mismo problema cuando quería consultar una tabla mediante un cursor. Muchas gracias, creo que es un excelente aporte!

ITP TIC's dijo...
Este comentario ha sido eliminado por el autor.
Jerome dijo...

Hola, en mi caso me dio un error y lo pude arreglar poniendo el nombre del esquema antes del nombre de la tabla.No sé si aparece este error en otros casos.
Saludos

Guilliman dijo...

Muchas gracias, me ha ayudado mucho lo de los permisos!

M@anuEL dijo...

Yo lo he resuelto como dijo Antonio Mora, poniendo el nombre del esquema antes del nombre de la tabla :)

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

Buenos días, soy penosamente nueva en PLSQL,tengo un problema con un parametro de una función, es un listado de estados para filtrar en la consulta, mostrar registros si cumple alguno de los estados.
He creado una tabla dentro de una función y al acceder a ella en la select me da ese error... no se cómo cambiar permisos ni cual es su esquema.

V_Estados Varchar2(300);
Type V_Listestados Is Table Of Varchar2(2);

-- la he cargado con los posibles estados con un For, puesto que vienen de una variable pasada como parámetro tipo 'AA;BB;CC'

select......... where tp.estpago in (select * from T_estados);

aquí me da el error... desconozco si es que es imposible hacer esto o estoy haciendo algo mal.

Muchas gracias anticipadas a todos.

Oscar dijo...

Hola Esther,
Intenta primero ejecutar el query directamente, sin pasar por PL/SQL.
Seguro vas a encontrar algo que no está bien.

Saludos.

Unknown dijo...

Hola Carlos, muchas gracias por responder... creo que mi problema es que no cargo bien la tabla para luego hacer la select.

He creado una tabla:

Create Or Replace type Tabla_Estados as table of Varchar2(2);

Y en mi programa anónimo con consigo cargarla...

*****************************************************************************************
Declare
T_Estados Tabla_Estados := Tabla_Estados();
P_estados Varchar2(30) := 'AA;BB;CC'; --- es un ejemplo (en realidad será un parámetro de entrada de mi funcion
v_aux varchar2(100); v_veces number; v_pos number;
begin
V_Aux := P_Estados ||';';
V_Veces := Length(V_Aux) - Length(Replace(V_Aux,';')); -- para saber el numero de entradas que tendré
For Num In 1..V_Veces Loop
V_Pos := Instr(V_Aux,';',1,Num);
T_Estados(Num) := Trim(Substr(v_aux,V_pos-2,2));
End Loop;
Dbms_Output.Put_Line(t_estados(1)); -- por mostrar uno y da error
End;

*****************************************************************************************
El error que me da es este:

Informe de error:
ORA-06533: Subíndice mayor que el recuento
ORA-06512: en línea 10
06533. 00000 - "Subscript beyond count"
*Cause: An in-limit subscript was greater than the count of a varray
or too large for a nested table.
*Action: Check the program logic and explicitly extend if necessary.

Unknown dijo...

Ya he encontrado el eeror, faltaba un extend para decir la longitud de la tabla:

Declare
T_Estados Tabla_Estados := Tabla_Estados();
P_estados Varchar2(30) := 'AA;BB;CC'; --- es un ejemplo (en realidad será un parámetro de entrada de mi funcion
v_aux varchar2(100); v_veces number; v_pos number;
begin
V_Aux := P_Estados ||';';
V_Veces := Length(V_Aux) - Length(Replace(V_Aux,';')); -- para saber el numero de entradas que tendré
T_estados.extend(v_veces); ***************************AQUI *********

For Num In 1..V_Veces Loop
V_Pos := Instr(V_Aux,';',1,Num);
T_Estados(Num) := Trim(Substr(v_aux,V_pos-2,2));
End Loop;

Dbms_Output.Put_Line(t_estados(1)); -- por mostrar uno y da error

End;

Julián E. dijo...

Gracias por el aporte, me ha servido!