No se puede seleccionar desde dba_tab_cols desde el procedimiento almacenado (PL / SQL)
-
03-07-2019 - |
Pregunta
Estoy intentando SELECCIONAR desde la vista dba_tab_cols desde un procedimiento almacenado. No funciona y no sé por qué.
Si ejecuto el siguiente SQL como una consulta:
SELECT t.data_type FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
funciona bien. Sin embargo, si lo copio en un procedimiento almacenado así:
SELECT t.data_type INTO dataType FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
Recibo el mensaje de error "PL / SQL: ORA-00942: la tabla o vista no existe" y el editor resalta dba_tab_cols al intentar compilar. Se está utilizando el mismo usuario de db en ambos casos.
dataType se declara como: dataType varchar2 (128);
PL / SQL (Oracle 9)
¿Alguien sabe el problema?
Solución
Es muy probable que sea un problema de privilegios. ¿El permiso para acceder a dba_tab_columns
a través de un rol o es una concesión de selección directa para su usuario? Los privilegios otorgados a través de Roles no están disponibles en SPROCS.
Una mirada rápida en Google sugiere usar all_tab_cols
en su lugar y ver si esa tabla tiene la información requerida que necesita.
Otros consejos
Para agregar a la respuesta de Eoin:
Para la mayoría de las personas, se trata de un sorpresa que el usuario no pueda seleccionar la tabla desde dentro de un procedimiento si no se le ha concedido el selecto directamente directamente (a diferencia de a través de el rol)
Si el usuario de la tabla intenta compilar esto procedimiento, obtiene un ORA-00942 aunque esta tabla ciertamente existe y se le concedió el derecho de seleccionar Esta mesa. El problema es ese los procedimientos no respetan roles; solamente Se respetan los derechos otorgados directamente. Entonces, eso significa que el propietario de la mesa tiene que vuelva a conceder el derecho a seleccionar:
No tengo instalado Oracle, pero quizás dataType es una palabra reservada. Intentaría otra cosa.