Как вывести куски кода из системной таблицы заключенные между BEGIN и END?

Как написать запрос, который выведет куски кода из системной таблицы all_source заключенный между BEGIN и END;

Простой пример :

NAME   TYPE      LINE     TEXT
....   ....      ....     ....
1233   PRIVATE   188      begin
1233   PRIVATE   189      (какой-то код)
1233   PRIVATE   190      (какой-то код)
....   ....      ....     ....
....   ....      ....     ....
1233   PRIVATE   198      end;

Так вот нужно вывести блоки кода между begin end; в одно поле При этом таких кусков между begin end; понятное дело много

Вообще суть задачи заключается в поиске кописта кода, нужно будет потом искать совпадения по блокам, но это уже другой вопрос, пока не получается вывести сами куски, блоки кода


Ответы (1 шт):

Автор решения: SwaD

В общем виде, это можно сделать следующим скриптом:

DECLARE
  fullText CLOB;
  doRecord BOOLEAN := FALSE;
BEGIN
  FOR cur IN (
    SELECT * FROM all_source s
    WHERE s.OWNER = 'SWAD'
    AND TYPE = 'PROGER'
    AND NAME = 'ORACLE_BLOCK'
  ) LOOP
    -- Если нашли end прекращаем запись
    IF (UPPER(cur.TEXT) LIKE '%END;%') THEN
      doRecord := FALSE; -- Не записываем
      -- Это разделитель, для красоты
      fullText := fullText || ' ----------------------------------- ' || sys.utl_tcp.CRLF;
      CONTINUE; -- Ниже делать нечего, идем на следующую итерацию
    END IF;
    -- Если флаг true, пишем в переменную строку, удаляя пробелы
    IF (doRecord) THEN
      fullText := fullText || TRIM(cur.TEXT);
      CONTINUE; -- Ниже делать нечего, идем на следующую итерацию
    END IF;
    -- Если нашли бегин, записываем со следующей строки
    IF (UPPER(cur.TEXT) LIKE '%BEGIN%') THEN
      doRecord := TRUE;
    END IF;
  END LOOP;
  -- Вывод в буфер, а так пишите куда хотите.
  dbms_output.put_line(fullText);
END;

Если в искомом объекте будет код с вложенными блоками, то надо будет скрипт допилить и вводить счетчик бегинов и ендов.

Но тут уже от вашей задумки зависит, т.к. не понятно, какой, допустим из 3-х вложений вам нужен.

→ Ссылка