आपको नीचे दिए गए कोड नमूने की नस में, 10g में plsql प्रोग्रामिंग का सहारा लेना पड़ सकता है। यह समाधान निश्चित रूप से कुछ अर्थों में क्रूर-बल है, क्योंकि आप मूल रूप से बहुत निम्न-स्तरीय प्राइमेटिव का उपयोग करके फ़ंक्शन/प्रक्रिया घोषणा पार्सर का हिस्सा लिखते हैं। हालांकि, रेगुलर एक्सप्रेशन फ़ंक्शन 10g में भी उपलब्ध नहीं हैं ...
कोड का सार है:
- प्रक्रिया/कार्य घोषणाओं के स्रोत कोड पंक्तियों पर पुनरावृति करें
- सबसे हाल ही में घोषित रूटीन का नाम नोट करें
- 'DEFAULT' कीवर्ड वाली सभी पंक्तियों का विश्लेषण करें, तर्क नाम और डिफ़ॉल्ट मान विनिर्देश प्राप्त करें (यह कोड नमूने में विस्तार से उल्लिखित नहीं है)।
नुकसान से सावधान रहें:
- बहुस्तरीय घोषणाएं
- सी-शैली की टिप्पणियां जिनमें सी-शैली की टिप्पणी शामिल है, शुरुआती तार (एक ला /* ब्ला ब्ला / ब्ला ब्ला **/ )
- कीवर्ड वाले स्ट्रिंग अक्षर
आशा है कि वैसे भी मदद करता है, सादर।
कोड:
DECLARE
l_arg_and_more VARCHAR2(400);
l_current_unit VARCHAR2(400);
l_default_spec VARCHAR2(400);
l_offset_default BINARY_INTEGER;
l_offset_eoname BINARY_INTEGER;
BEGIN
FOR i IN (
select text
from all_source
where owner = '<name of owner>'
and name = '<object name>'
and type in ( 'PACKAGE', 'PROCEDURE', 'FUNCTION')
and text not like '--%'
order by line
) LOOP
IF i.text LIKE '%FUNCTION%' OR i.text LIKE '%PROCEDURE%' THEN
IF i.text LIKE '%FUNCTION%' THEN
l_current_unit := LTRIM(SUBSTR(i.text, INSTR(i.text, 'FUNCTION') + LENGTH('FUNCTION')), ' ');
l_offset_eoname := INSTR(l_current_unit, ' ');
IF l_offset_eoname = 0 OR l_offset_eoname > INSTR(l_current_unit, '(') THEN
l_offset_eoname := INSTR(l_current_unit, '(');
END IF;
IF l_offset_eoname <> 0 THEN
l_current_unit := SUBSTR(l_current_unit, 1, l_offset_eoname-1);
ELSE
l_current_unit := 'unidentified';
END IF;
END IF;
END IF;
--
IF i.text LIKE '%DEFAULT%' THEN
l_offset_default := INSTR (i.text, 'DEFAULT');
l_arg_and_more := SUBSTR(i.text, 1, l_offset_default - 1);
l_default_spec := SUBSTR(i.text, l_offset_default + LENGTH('DEFAULT') + 1);
--
-- process l_arg_and_more to get the arg name, l_default_spec for the default value
--
END IF;
END LOOP;
END;