2010-05-18 11 views
9

Tôi đang cố gắng lấy siêu dữ liệu thủ tục được lưu trữ (tên thủ tục, kiểu tham số, tên tham số, v.v) cho một quy trình được khai báo trong gói Oracle. ADO.NET API - DbConnection.GetSchema gọi. Tôi đang sử dụng trình điều khiển ODP.Lấy siêu dữ liệu thủ tục lưu trữ cho một thủ tục trong gói Oracle bằng cách sử dụng ADO.NET

Tôi thấy rằng Gói được liệt kê trong bộ sưu tập siêu dữ liệu 'Gói' và 'PackageBodies'. Tham số thủ tục xuất hiện trong các bộ sưu tập 'Arguments' và 'ProcedureParameters'. Tôi không thấy cách để truy cập thông tin quy trình thông qua siêu dữ liệu gói. Ngay cả khi các thủ tục không có bất kỳ tham số có một hàng trong bộ sưu tập 'ProcedureParameters' cho thủ tục này.

Câu hỏi của tôi: Để có được siêu dữ liệu thủ tục, tôi có phải truy vấn bộ sưu tập 'ProcedureParameters' và tìm kiếm một mục có tên gói được yêu cầu không? Sau đó tôi có thể xây dựng siêu dữ liệu thủ tục dựa trên thông tin tham số. Có cách nào ngắn hơn hoặc nhanh hơn để có được cùng một thông tin không?

Trả lời

8

Với sự trợ giúp từ Bob, tôi đã sử dụng truy vấn sau đây để lấy danh sách các thủ tục được lưu trữ được xác định trong gói.

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" 

Điều này trả về tất cả các thủ tục được lưu trữ cho một người dùng cụ thể. Sau đó tôi có thể sử dụng bộ sưu tập 'ProcedureParameters' để lấy thông tin tham số cho chúng.

LƯU Ý: Không truy vấn bảng SYS.DBA_PROCEDURES. Thông tin người dùng bạn sử dụng để thực hiện truy vấn có thể không có đặc quyền 'chọn' trên bảng đó.

15

Tôi không chắc chắn làm thế nào bạn muốn có được điều này sử dụng ADO.NET, nhưng bạn có thể trực tiếp truy vấn cơ sở dữ liệu để có được thông tin này như sau:

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

Một khi bạn đã chạy các truy vấn trên bạn sẽ có một tập hợp kết quả có trong số những thứ khác, PROCEDURE_NAME. Với tên gói và PROCEDURE_NAME, bạn có thể tìm thông tin tham số bằng cách sử dụng truy vấn sau:

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

Chia sẻ và thưởng thức.

+0

Cảm ơn vì điều đó. Tôi đã sửa đổi các truy vấn một chút để có được danh sách các sps. Không có cột 'OBJECT_TYPE' trong SYS.DBA_PROCEDURES. Tôi đang sử dụng ORACLE 10.2.0.1.0 – alwayslearning