Impossible de sélectionner dba_tab_cols dans une procédure stockée (PL / SQL)
-
03-07-2019 - |
Question
J'essaie de sélectionner une vue stockée dans la vue dba_tab_cols. Cela ne fonctionne pas et je ne sais pas pourquoi.
Si j'exécute le code SQL suivant en tant que requête:
SELECT t.data_type FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
cela fonctionne bien. Cependant, si je le copie dans une procédure stockée comme ceci:
SELECT t.data_type INTO dataType FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
Je reçois le message d'erreur "PL / SQL: ORA-00942: la table ou la vue n'existe pas". et l'éditeur met en évidence dba_tab_cols lors de la compilation. Le même utilisateur de base de données est utilisé dans les deux cas.
type de données est déclaré comme: dataType varchar2 (128);
PL / SQL (Oracle 9)
Quelqu'un connaît le problème?
La solution
C'est probablement un problème de privilèges. La permission d'accéder à dba_tab_columns
via un rôle ou s'agit-il d'un droit de sélection directe à votre utilisateur? Les privilèges accordés via des rôles ne sont pas disponibles dans SPROCS.
Un rapide coup d'œil sur Google suggère d'utiliser plutôt all_tab_cols
et de voir si cette table contient les informations requises dont vous avez besoin.
Autres conseils
Pour ajouter à la réponse de Eoin:
Pour la plupart des gens, il s’agit d’un surprise que l'utilisateur ne peut pas sélectionner la table à l'intérieur d'une procédure si il n'a pas obtenu le choix directement (par opposition à travers le rôle)
Si l'utilisateur de la table essaie de le compiler procédure, il obtient un ORA-00942 bien que cette table existe certainement et il a obtenu le droit de choisir cette table. Le problème est que les procédures ne respectent pas les rôles; seulement les droits accordés directement sont respectés. Donc, cela signifie que le propriétaire de la table doit regrant le droit de choisir:
Oracle n'est pas installé sur mon ordinateur, mais peut-être que dataType est un mot réservé. J'essaierais autre chose.