Oracle
 sql >> база данни >  >> RDS >> Oracle

Вземете списък с аргументи със стойност по подразбиране

може да се наложи да прибегнете до програмиране на plsql в 10g, в духа на примерния код по-долу. това решение със сигурност е груба сила в известен смисъл, тъй като вие основно пишете част от парсер за декларация на функция/процедура, използвайки примитиви на много ниско ниво. обаче функциите за регулярен израз също не са налични в 10g ...

същността на кода е:

  • итерация по редовете на изходния код на декларациите на процедура/функция
  • отбележете името на най-скоро декларираната рутина
  • анализирайте всички редове, съдържащи ключовата дума „DEFAULT“, като получите името на аргумента и спецификацията на стойността по подразбиране (това не е описано подробно в примерния код).

пазете се от капани:

  • многоредови декларации
  • Коментари в стил C, съдържащи начални низове в стил C (a la /* бла-бла / бла бла **/ )
  • низови литерали, съдържащи ключови думи

надявам се, че все пак ще помогне, най-добри пожелания.

кодът:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-добрият начин за обработка на LOB в разпределени бази данни на Oracle

  2. Вмъкнете в от CTE

  3. Проблем с мутация на задействане

  4. SQL заявка за получаване на прецизната стойност на колона

  5. Как мога да направя функция, която да връща име(на) на колона(а) на ограничение?