powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг pl/sql
14 сообщений из 39, страница 2 из 2
Парсинг pl/sql
    #39360823
aksufun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_paint,

к счастью END после которого не идет иных символов кроме пробела и перевода строки + ; только от BEGIN'а, так что это достаточно легко обходится.

Большей проблемой для меня стало то, что по коду может быть раскидано куча комментариев, их структура может быть не валидна (многострочники) и в этих комментариях тоже могут быть BEGIN'ы и END'ы и их учитывать в подсчете не надо.
По счастью в том коде, для которого я эту утилиту написал, нет BEGIN'ов и END'ов в комментариях, так что я пока отложил борьбу с комментами)
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360825
dbms_coreldraw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И даже алиасы такие дать можно.
Код: plsql
1.
2.
3.
4.
5.
select 0 begin, 1 end from dual;

     BEGIN        END
---------- ----------
         0          1
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360828
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aksufunВ воздухе висит вопрос -- как же эта информация поможет нам узнать ид строки, после которой надлежит воткнуть логирование? Ведь именно такова была изначальная постановка задачи.Гибче надо мыслить, гибче. Что если пытаться логирование "воткнуть" не после, а перед end. End ищется непосредественно перед каждой хранимкой нужного уровня вложенности или с конца файла. Да, после end может быть имя объекта.
Так и знал, что не допилишь. :)
dbms_paintТвоя задача в общем случае решается достаточно трудоемко. Надо учесть и не споткнуться о такие выражения, как case ... end, case ... end case, if ... end if.Любая попытка изобретать парсеро-велосипеды в общем случае обречена на провал.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select begin_end.*,
       case
          when begin = end then end
          else begin
       end
          "begin null; end;"
  from (select (select 'begin;' begin
                  from dual end)
                  end,
               'end;' begin
          from dual begin) begin_end
/

END    BEGI begin
------ ---- ------
begin; end; end;
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360830
aksufun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_coreldraw,

вот на sql выражениях с алиасами аля " select 0 begin from dual " у меня всё ломается, факт. Но такого, к счастью, нет.
Тут уже я не знаю как легко это обойти, нужно парсить до уровня команд, а там и до AST недалеко.
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360832
aksufun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

как можно воткнуть логирование "после" end'a ? там уже процедура кончилась :)

А почему мне нужно втыкать именно после первого BEGIN'а тела функции -- так это потому, что в некоторых местах имеем IN/OUT параметры, которые хотелось бы поймать на начало выполнения функции, до их модификации.

В целом нет никакой разницы идти ли с конца или с начала, если применять метод подсчета бегинов-эндов. Что так, что так наткнешься на вложенные функции и как-то нужно их пропустить.

Ты так и не показал, для чего с таким упорством кидался в меня pl/scope'ом.
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360834
aksufun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем случае я могу поступить с DML выражениями точно так же как с комментариями -- превратить их в пустое место равноценного объема на период подсчета.
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360836
n0rd1c.c0ld
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aksufunк счастью END после которого не идет иных символов кроме пробела и перевода строки + ; только от BEGIN'а, так что это достаточно легко обходится.
Не уверен, что правильно понял посыл, но ты ошибаешься
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SQL> create or replace procedure proc
  2  is
  3     procedure subproc
  4        (a number)
  5     is
  6     begin
  7        begin
  8           null;
  9        end label1;
 10     end subproc;
 11  begin
 12     begin
 13        null;
 14     end label2;
 15  end proc;
 16  /
Procedure created

SQL> select a.object_name, a.object_type, a.status from user_objects a where a.object_name = 'PROC';
OBJECT_NAME     OBJECT_TYPE             STATUS
--------------- ----------------------- -------
PROC            PROCEDURE               VALID

SQL> 
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360841
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aksufun,

Я вроде как сказал изначально, что затея бредовая.
Потом было указано как получить список процедур (любого или верхнего уровня) - pl scope.
Зная где начинанается каждая из них, при определенных условностях достаточно просто найти конец предыдущей и вставить перед ним логирование.
Я изначально подумал, что цель вставить логирование в блок exception, но видимо все еще замысловатее.
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360845
aksufun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
n0rd1c.c0ld,

согласен, здесь я ошибся. забыл про end <label>;
у меня таких мест нет, иначе бы попадало всё, но если бы были, то проблема бы решилась в пару if'ов
end case | end loop | end if, что там еще есть...

Вообще если бы я решал общую задачу парсинга любого, даже самого извращенного исходника, то я бы не взялся за написание парсера, конечно. Проще и быстрее прикрутить через JAVA Calls что-то типа https://github.com/porcelli/plsql-parser
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360847
aksufun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

с первого поста >> После BEGIN'а я вставлю логирующую строку, содержащую в качестве входных данных имя функции и некоторые переменные,взятые из контекста.
>> после BEGIN'а

до конца не читай @ проблему не понимай @ ответ набирай
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360848
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aksufun,

Независимо от тонкостей хотелки, первый ответ остается в силе.
19968275
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360856
aksufun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

надеюсь, что ты работаешь в твоем идеальном розовом мире, где ничего "эдакого" писать не надо и не хочется, иначе ж обплеваться можно)) Где проблемы решаются просто мыслью о том, что "где-то там был какой-то пакет который вроде бы умеет это" и где не нужно проверять идеи до конца) лишь бы не оказалось, что энциклопедические знания подвели и пакет задачу не решает, да? неловко может получиться.

а мне и так хорошо)
была проблема, появилась идея, идея была оппробирована и реализована, задача была выполнена в полном объеме, быстрее, чем копипастить и много надежнее.
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360873
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aksufundbms_photoshop,

надеюсь, что ты работаешь в твоем идеальном розовом мире, где ничего "эдакого" писать не надо и не хочется, иначе ж обплеваться можно)) Где проблемы решаются просто мыслью о том, что "где-то там был какой-то пакет который вроде бы умеет это" и где не нужно проверять идеи до конца) лишь бы не оказалось, что энциклопедические знания подвели и пакет задачу не решает, да? неловко может получиться.

а мне и так хорошо)
была проблема, появилась идея, идея была оппробирована и реализована, задача была выполнена в полном объеме, быстрее, чем копипастить и много надежнее.Я предпочитаю все формализировать и минимизировать человеческий фактор.
Во-первых когда я писал на PL/SQL, то было строгое правило что каждая программная единица заканчивается end <name>;.
Во-вторых были правила к оформлению коментариев и входных параметров.
В-третьих весь код форматировался автоматически с едиными настройками бьютифаера/форматтера и т.д.
При соблюдении процесса, если код не прошел review он дальше не идет.
Всегда остается простантсво для ошибки, но праивльная организация разработки на первом месте, технические костыли только усугубят ситуацию.

Возвращаясь к твоей проблеме, при соблюдении стандартов проблема решается тривиально, в общем случае не решается вообще.
pl scope позволяет разбить на единицы и автоматизировать процесс при заданных ограничениях, но лучше один раз автоматиазированно отформатировать и потом пройтись ручками + следовать стандарту оформления кода.
Можно же пытаться изобретать бесполезные велосипеды. Ты, к сожалению, так верных выводов и не сделал.
Хотя если зп платят по числу строк кода, то тебя, конечно можно понять.
...
Рейтинг: 0 / 0
Парсинг pl/sql
    #39360969
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Toad можно номера строк вытащить, если прогнать через code analysis по нарушениям rule 4404 "avoid unlabeled end of program units"
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг pl/sql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]