جدول العرض/نظام Oracle DB للتحقق مما إذا كان جزء من الحزمة هو إجراء أو وظيفة

StackOverflow https://stackoverflow.com/questions/2343401

  •  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). المطابقة فقط بالاسم قد لا تكون كافية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top