2010-05-18 6 views
9

Ich versuche, die gespeicherten Prozedurmetadaten (Prozedurname, Parametertypen, Parameternamen usw.) für eine in einem Oracle-Paket deklarierte Prozedur unter Verwendung des Standards zu erhalten ADO.NET API - DbConnection.GetSchema Aufruf. Ich verwende den ODP-Treiber.Abrufen gespeicherter Prozedurmetadaten für eine Prozedur in einem Oracle-Paket mit ADO.NET

Ich sehe, dass das Paket in den Metadaten-Sammlungen "Packages" und "PackageBodies" aufgeführt ist. Der Prozedurparameter wird in den Sammlungen 'Arguments' und 'ProcedureParameters' angezeigt. Ich sehe keine Möglichkeit, über die Paketmetadaten zu den Verfahrensinformationen zu gelangen. Auch wenn die Prozedur keine Parameter enthält, befindet sich in der Sammlung 'ProcedureParameters' eine Zeile für diese Prozedur.

Meine Frage: Um die Prozedur-Metadaten zu erhalten, muss ich die 'ProcedureParameters'-Sammlung abfragen und nach einem Eintrag mit dem erforderlichen Paketnamen suchen? Ich kann dann die Prozedur-Metadaten basierend auf den Parameterinformationen konstruieren. Gibt es eine kürzere oder schnellere Möglichkeit, die gleichen Informationen zu erhalten?

Antwort

8

Mit Hilfe von Bob habe ich die folgende Abfrage verwendet, um eine Liste der gespeicherten Prozeduren zu erhalten, die in einem Paket definiert sind.

SELECT a.OBJECT_NAME,p.PROCEDURE_NAME FROM SYS.ALL_OBJECTS a, SYS.ALL_PROCEDURES p WHERE a.OBJECT_NAME = p.OBJECT_NAME AND a.OBJECT_TYPE = 'PACKAGE' AND a.OWNER = '" + ownerName + "' AND p.PROCEDURE_NAME IS NOT NULL" 

Dies gibt alle gespeicherten Prozeduren für einen bestimmten Benutzer zurück. Ich kann dann die Sammlung 'ProcedureParameters' verwenden, um die Parameterinformationen für sie abzurufen.

Hinweis: die Tabelle SYS.DBA_PROCEDURES nicht abfragen. Die Benutzeranmeldeinformationen, die Sie zum Ausführen der Abfrage verwenden, besitzen möglicherweise keine Auswahlrechte für diese Tabelle.

15

Ich bin nicht sicher, wie Sie dies mit ADO.NET bekommen würde, aber Sie können direkt auf die Datenbank abfragen, um diese Informationen zu erhalten, wie folgt:

SELECT * 
    FROM SYS.DBA_PROCEDURES 
    WHERE OBJECT_TYPE = 'PACKAGE' AND 
     OBJECT_NAME = '<your package name here>' AND 
     PROCEDURE_NAME IS NOT NULL; 

Sobald Sie die obige Abfrage ausgeführt haben Sie habe ein Ergebnis, das unter anderem die PROCEDURE_NAME enthält. In Anbetracht der Paketname und der PROCEDURE_NAME, können Sie Parameterinformationen mithilfe der folgenden Abfrage finden:

SELECT * 
    FROM SYS.ALL_ARGUMENTS 
    WHERE PACKAGE_NAME = '<your package name here>' AND 
     OBJECT_NAME = '<PROCEDURE_NAME from query above>'; 

teilen und genießen.

+0

Danke dafür. Ich habe die Abfrage ein wenig modifiziert, um die Liste der SPs zu erhalten. In SYS.DBA_PROCEDURES gibt es keine Spalte "OBJECT_TYPE". Ich verwende ORACLE 10.2.0.1.0 – alwayslearning

Verwandte Themen