Как вывести куски кода из системной таблицы заключенные между 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 шт):
В общем виде, это можно сделать следующим скриптом:
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-х вложений вам нужен.