Möglicherweise müssen Sie auf die plsql-Programmierung in 10g zurückgreifen, ähnlich wie im folgenden Codebeispiel. Diese Lösung ist in gewissem Sinne sicherlich Brute-Force, da Sie im Grunde genommen einen Teil eines Funktions-/Prozedur-Deklarations-Parsers schreiben, der sehr einfache Primitive verwendet. jedoch sind reguläre Ausdrucksfunktionen in 10g auch nicht verfügbar ...
Das Wesentliche des Codes ist:
- über die Quellcodezeilen von Prozedur-/Funktionsdeklarationen iterieren
- Notieren Sie sich den Namen der zuletzt deklarierten Routine
- alle Zeilen analysieren, die das Schlüsselwort 'DEFAULT' enthalten, wobei der Argumentname und die Standardwertspezifikation abgerufen werden (dies wird im Codebeispiel nicht im Detail beschrieben).
Vorsicht vor Fallstricken:
- mehrzeilige Deklarationen
- Kommentare im C-Stil, die Anfangszeichenfolgen für Kommentare im C-Stil enthalten ( a la /* blah blah / bla bla **/ )
- String-Literale, die Schlüsselwörter enthalten
hoffe das hilft trotzdem, viele grüße.
der Code:
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;