2009-04-29 9 views
3

Ich versuche SELECT aus der dba_tab_cols Ansicht aus einer gespeicherten Prozedur. Es funktioniert nicht und ich weiß nicht warum.Kann nicht von dba_tab_cols aus innerhalb der gespeicherten Prozedur (PL/SQL) auswählen

Wenn ich die folgende SQL als Abfrage ausführen:

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

es funktioniert gut. Allerdings, wenn ich es in eine gespeicherte Prozedur kopieren wie so:

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

erhalte ich die Fehlermeldung „PL/SQL: ORA-00942: Tabelle oder Sicht nicht existiert“ und das Editor-Highlights dba_tab_cols während zu kompilieren versuchen. In beiden Fällen wird derselbe DB-Benutzer verwendet.

dataType wird wie folgt deklariert: dataType varchar2 (128);

PL/SQL (Oracle 9)

Wer das Thema wissen?

Antwort

9

Es ist höchstwahrscheinlich ein privilegiertes Problem. Ist die Berechtigung, über eine Rolle auf dba_tab_columns zuzugreifen, oder ist es eine direkte Auswahlhilfe für Ihren Benutzer? Privilegien, die über Rollen erteilt wurden, sind in SPROCS nicht verfügbar.

Ein kurzer Blick auf Google schlägt vor, stattdessen all_tab_cols zu verwenden und zu sehen, ob diese Tabelle die erforderlichen Informationen hat, die Sie benötigen.

+0

Dank, das scheint zu funktionieren! Ich konnte die Antwort mit Google nicht finden :) –

-1

Ich habe Oracle nicht installiert, aber vielleicht DataType ist ein reserviertes Wort. Ich würde etwas anderes versuchen.

4

zu Eoin Antwort hinzu:

Für die meisten Menschen, es kommt als Überraschung, dass der Benutzer nicht die Tabelle aus einer Prozedur wählen kann, wenn hat er nicht die select rechts direkt erteilt (im Gegensatz die Rolle durch)

Wenn Tabellen Benutzer versuchen, diese Prozedur zu kompilieren, bekommt er ein ORA-00942 obwohl diese Tabelle sicherlich und er existiert wurde das Recht gewährt, diese Tabelle auszuwählen. Das Problem ist, dass Prozeduren Rollen nicht respektieren; Nur direkt gewährte Rechte werden respektiert. So , bedeutet das, dass der Tabelleneigentümer das Recht auf regrant hat zu wählen:

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

+0

Danke, dieser Link war sehr hilfreich. –