2010-05-18 23 views
9

Estoy tratando de obtener los metadatos del procedimiento almacenado (nombre del procedimiento, tipos de parámetros, nombres de parámetros, etc.) para un procedimiento declarado dentro de un paquete Oracle, usando el estándar ADO.NET API - Llamada DbConnection.GetSchema. Estoy usando el controlador ODP.Obtener metadatos de procedimientos almacenados para un procedimiento dentro de un paquete Oracle usando ADO.NET

Veo que el paquete figura en las colecciones de metadatos 'Paquetes' y 'PaquetesBordes'. El parámetro de procedimiento aparece en las colecciones 'Arguments' y 'ProcedureParameters'. No veo una forma de acceder a la información del procedimiento a través de los metadatos del paquete. Incluso si el procedimiento no tiene ningún parámetro, hay una fila en la colección 'ProcedureParameters' para este procedimiento.

Mi pregunta: Para obtener los metadatos del procedimiento, ¿tengo que consultar la colección 'ProcedureParameters' y buscar una entrada con el nombre del paquete requerido? Luego puedo construir los metadatos del procedimiento basados ​​en la información del parámetro. ¿Hay una forma más rápida o más corta de obtener la misma información?

Respuesta

8

Con ayuda de Bob He utilizado la siguiente consulta para obtener una lista de procedimientos almacenados definidos dentro de un paquete.

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" 

Esto devuelve todos los procedimientos almacenados para un usuario en particular. Luego puedo usar la colección 'ProcedureParameters' para obtener la información del parámetro para ellos.

NOTA: No consulte la tabla SYS.DBA_PROCEDURES. Las credenciales de usuario que utiliza para ejecutar la consulta pueden no tener privilegios 'select' en esa tabla.

15

no estoy seguro de cómo se conseguiría esto usando ADO.NET, pero se puede consultar directamente la base de datos para obtener esta información de la siguiente manera:

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

Una vez que haya ejecutado la consulta anterior se Tendremos un conjunto de resultados que tiene, entre otras cosas, el PROCEDURE_NAME. Dado el nombre del paquete y la PROCEDURE_NAME, se puede encontrar información de los parámetros utilizando la siguiente consulta:

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

Compartir y disfrutar.

+0

Gracias por eso. He modificado un poco la consulta para obtener la lista de sps. No hay una columna 'OBJECT_TYPE' en SYS.DBA_PROCEDURES. Estoy usando ORACLE 10.2.0.1.0 – alwayslearning

Cuestiones relacionadas