جدول العرض/نظام Oracle DB للتحقق مما إذا كان جزء من الحزمة هو إجراء أو وظيفة
-
23-09-2019 - |
سؤال
أنا أستخدم أوراكل جداول النظام للحصول على بعض البيانات الوصفية حول الحزم في قاعدة البيانات الخاصة بنا.
هنا أحد استفساراتي:
select AP.PROCEDURE_NAME
from ALL_PROCEDURES ap
where ap.object_name = :object_name
and ap.owner=:owner
and ap.procedure_name is not NULL
and ap.procedure_name like :procedure_name
أريد أيضًا معرفة ما إذا كان الكائن المحدد إما وظيفة أو إجراء أو نوع. لا يمكنني العثور على طريقة مباشرة لسحب البيانات مباشرة من جدول.
يرجى الملاحظة: لا أريد أن أضطر إلى تحليله من all_sources.
المحلول
اتضح أن هناك طريقة عرض all_arguments حيث يمكنك الحصول على جميع المعلمات للطريقة في الحزمة. عندما تكون الطريقة هي وظيفة ، توجد وسيطة تحمل اسمًا فارغًا يمثل قيمة الإرجاع. لذلك إذا انضمت إلى all_arguments ، يمكنك تحديد ما إذا كان إدخال All_procedures معين وظيفة أو إجراء. ما يلي هو مثال يوضح مثل هذا الاختيار.
select CASE (Select count(*) from ALL_ARGUMENTS aa
where aa.object_name=ap.procedure_name
and aa.object_id = ap.object_id
and argument_name is null)
WHEN 1 THEN 'FUNCTION'
WHEN 0 THEN 'PROCEDURE'
ELSE ''
END as is_function, ap.*
from all_procedures ap
where ap.object_name like '<package name>'
نصائح أخرى
SQL> select distinct object_type from user_procedures;
OBJECT_TYPE
-------------------
PROCEDURE
PACKAGE
TRIGGER
FUNCTION
أظن أنه لن يكون لديه أي خيار. على الأقل ، يتم تنسيقه جيدًا - تبدأ جميع الأنواع بالنوع ، وهلم جرا.
يمكنك استخدام SQL*Plus و DESC
الأمر الذي يعمل على الحزم:
SQL> desc dbms_application_info;
PROCEDURE READ_CLIENT_INFO
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
CLIENT_INFO VARCHAR2 OUT
PROCEDURE READ_MODULE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
MODULE_NAME VARCHAR2 OUT
ACTION_NAME VARCHAR2 OUT
PROCEDURE SET_ACTION
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
ACTION_NAME VARCHAR2 IN
PROCEDURE SET_CLIENT_INFO
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
CLIENT_INFO VARCHAR2 IN
PROCEDURE SET_MODULE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
MODULE_NAME VARCHAR2 IN
ACTION_NAME VARCHAR2 IN
PROCEDURE SET_SESSION_LONGOPS
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
RINDEX BINARY_INTEGER IN/OUT
SLNO BINARY_INTEGER IN/OUT
OP_NAME VARCHAR2 IN DEFAULT
TARGET BINARY_INTEGER IN DEFAULT
CONTEXT BINARY_INTEGER IN DEFAULT
SOFAR NUMBER IN DEFAULT
TOTALWORK NUMBER IN DEFAULT
TARGET_DESC VARCHAR2 IN DEFAULT
UNITS VARCHAR2 IN DEFAULT
من خلال التكرار على الحزم ، وتحليل النتائج - إنه بنية أسهل لتحليلها من DBA_Source - قد تحصل على ما تريد. تحذير لتذكره ؛ دعم الحزم الزائد حتى تتمكن من الحصول على كليهما FUNCTION foo(date) RETURN date
, ، و PROCEDURE foo(varchar)
. المطابقة فقط بالاسم قد لا تكون كافية.