Não é possível selecionar a partir dba_tab_cols de dentro procedimento armazenado (PL / SQL)
-
03-07-2019 - |
Pergunta
Eu estou tentando selecionar a partir da dba_tab_cols ver de dentro de um procedimento armazenado. Não está funcionando e eu não sei porquê.
Se eu executar o seguinte SQL como uma consulta:
SELECT t.data_type FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
ele funciona bem. No entanto, se eu copiá-lo em um procedimento armazenado como assim:
SELECT t.data_type INTO dataType FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
Eu recebo a mensagem de erro "PL / SQL: ORA-00942: tabela ou exibição não existe" e as dba_tab_cols editor de destaques ao tentar compilar. O mesmo usuário db está sendo usado em ambos os casos.
dataType é declarado como: dataType VARCHAR2 (128);
PL / SQL (Oracle 9)
Alguém sabe o problema?
Solução
É provavelmente um problema de privilégios. É a permissão de acesso dba_tab_columns
através de um papel ou é uma concessão selecione direto para o seu usuário? Privilégios concedidos via Roles não estão disponíveis em SPROCS.
Uma rápida olhada no Google sugere o uso de all_tab_cols
vez e ver se que a tabela tem as informações necessárias que você precisa.
Outras dicas
Para adicionar a resposta de Eoin:
Para a maioria das pessoas, ela vem como um surpreender que o usuário não pode selecionar a tabela de dentro de um procedimento se ele não foi concedido o select direita directamente (em oposição a através o papel)
Se usuário tenta tabela para compilar este procedimento, ele recebe um ORA-00942 embora esta tabela certamente existe e ele foi concedido o direito de escolher essa mesa. O problema é que procedimentos não respeitam papéis; só direitos directamente concedidos são respeitados. Então, isso significa que o proprietário da tabela tem de regrant o direito de escolha:
Eu não tenho Oracle instalado, mas talvez dataType é uma palavra reservada. Eu ia tentar outra coisa.