sql >> Database >  >> RDS >> Oracle

Lijst met argumenten met standaardwaarde ophalen

misschien moet je je toevlucht nemen tot plsql-programmering in 10g, in de trant van het onderstaande codevoorbeeld. deze oplossing is in zekere zin zeker brute-force, omdat je in feite een deel van een functie/procedure-declaratie-parser schrijft met behulp van primitieven op zeer laag niveau. reguliere expressiefuncties zijn echter ook niet beschikbaar in 10g ...

de kern van de code is:

  • herhaal de broncoderegels van procedure-/functiedeclaraties
  • noteer de naam van de meest recent gedeclareerde routine
  • analyseer alle regels die het trefwoord 'DEFAULT' bevatten en verkrijg de argumentnaam en de standaardwaardespecificatie (dit wordt niet in detail beschreven in het codevoorbeeld).

pas op voor valkuilen:

  • declaraties met meerdere regels
  • Opmerkingen in C-stijl met begintekenreeksen voor opmerkingen in C-stijl( a la /* blah blah / bla bla **/ )
  • tekenreeksen die zoekwoorden bevatten

hoop dat dat in ieder geval helpt, vriendelijke groeten.

de 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;


  1. Autocomplete Textbox-resultaten op basis van SQL-database

  2. Sleutelwaardepaar verwijderen uit jsonb geneste array in postgresql

  3. Is het beter om een ​​index te maken voordat u een tabel met gegevens vult, of nadat de gegevens op hun plaats zijn?

  4. MySQL SELECT-functie om huidige gegevens op te tellen