2010-05-18 23 views
9

Ben bir Oracle paketi içinde bildirilen bir prosedür için saklı yordam meta (prosedür adı, parametre tipleri, parametre adları vb) elde etmek için çalışıyorum kullanarak bir Oracle paket içinde bir prosedür için saklı yordam meta elde ADO.NET API - DbConnection.GetSchema çağrısı. ODP sürücüsünü kullanıyorum.standardını kullanarak, ADO.NET

ben Paketi 'Paketleri' ve 'PackageBodies' meta koleksiyonlarında listelendiğini görüyoruz. Prosedür parametresi 'Argümanlar' ve 'ProsedürParametreler' koleksiyonlarında görüntülenir. Paket meta verileri aracılığıyla prosedür bilgilerine ulaşmanın bir yolunu görmüyorum. Prosedürün herhangi bir parametresi olmasa bile, bu prosedür için 'ProcedureParameters' koleksiyonunda bir satır vardır.

Sorum: yordam meta elde etmek ı 'ProcedureParameters' koleksiyonunu sorgulamak ve gerekli paket adıyla bir girişi aramak gerekiyor? Sonra, parametre bilgilerine dayanarak prosedür meta verilerini yapılandırabilirim. Aynı bilgiyi elde etmek için daha kısa veya daha hızlı bir yol var mı?

cevap

8

Bob Bir paket içinde tanımlı saklı yordamlar bir listesini elde etmek için aşağıdaki sorguyu kullandım.

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" 

Bu, belirli bir kullanıcı için tüm saklı yordamları döndürür. Daha sonra onlar için parametre bilgilerini almak için 'ProcedureParameters' koleksiyonunu kullanabilirim.

NOT: SYS.DBA_PROCEDURES tabloyu sorgulamak vermeyin. Sorguyu yürütmek için kullandığınız kullanıcı kimlik bilgileri, o tabloda "seçme" ayrıcalıklarına sahip olmayabilir.

15

Bunu kullanarak ADO.NET olacaktı emin değilim ama şöyle doğrudan bu bilgileri almak için veritabanını sorgulayabilir:

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

Yukarıdaki sorgu çalıştırmak sonra Diğer şeylerin yanı sıra PROCEDURE_NAME adlı bir sonuç kümesine sahip olacaksınız.

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

Share ve tadını: paket adı ve procedure_name göz önüne alındığında, aşağıdaki sorguyu kullanarak parametre bilgileri bulabilirsiniz. yardımıyla

+0

Bunun için teşekkürler. Sps listesini almak için sorguyu biraz değiştirdim. SYS.DBA_PROCEDURES dosyasında 'OBJECT_TYPE' sütunu yok. ORACLE 10.2.0.1.0 kullanıyorum – alwayslearning