2009-04-29 5 views
3

J'essaie de sélectionner à partir de la vue dba_tab_cols à partir d'une procédure stockée. Ça ne marche pas et je ne sais pas pourquoi.Impossible de sélectionner dba_tab_cols à partir de la procédure stockée (PL/SQL)

Si j'exécute l'instruction SQL suivante comme une requête:

SELECT t.data_type FROM dba_tab_cols t 
WHERE 
    t.table_name = 'ACCOUNTTYPE' AND 
    t.column_name = 'ACCESSEDBY'; 

il fonctionne très bien. Toutefois, si je 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: table ou vue n'existe pas » et l'éditeur met en évidence dba_tab_cols tout en essayant de compiler. Le même utilisateur db est utilisé dans les deux cas. Le type de données est déclaré comme suit: dataType varchar2 (128);

PL/SQL (Oracle 9)

Quelqu'un sait-il la question?

Répondre

9

C'est probablement un problème de privilège. Est-ce que l'autorisation d'accéder à dba_tab_columns via un rôle ou est-ce une subvention de sélection directe à votre utilisateur? Les privilèges accordés via les rôles ne sont pas disponibles dans SPROCS. Un rapide coup d'oeil sur google suggère d'utiliser all_tab_cols à la place et voir si cette table a l'information dont vous avez besoin.

+0

Merci qui semble fonctionner! Je ne pouvais pas trouver la réponse avec Google :) –

-1

Je n'ai pas Oracle installé, mais peut-être DataType est un mot réservé. J'essaierais autre chose.

4

Pour ajouter à la réponse de Eoin:

Pour la plupart des gens, il se présente comme un surprenant que l'utilisateur ne peut pas sélectionner la table à partir d'une procédure si il n'a pas été accordé la sélection droit directement (par opposition à par le biais du rôle)

Si l'utilisateur de table tente de compiler cette procédure , il obtient un ORA-00942 bien que cette table existe certainement et il a été autorisé à sélectionner cette table. Le problème est que les procédures ne respectent pas les rôles; seuls les droits directement attribués sont respectés. Donc, cela signifie que le propriétaire de la table doit regrant le droit de sélectionner:

http://www.adp-gmbh.ch/ora/err/ora_00942.html

+0

Merci, ce lien a été très utile. –

Questions connexes