regex: отделение процедуры / функции от кода PL / SQL - PullRequest
0 голосов
/ 24 сентября 2010

Я пишу код регулярного выражения Perl, чтобы отделить процедуру PL / SQL от пакета.

Каждая процедура начинается с ключевого слова PROCEDURE и заканчивается END, но END для BEGIN, IF или LOOP. Может быть много BEGIN | IF | LOOP.

Ниже приведен вид ввода, я хочу разделить каждую процедуру. Как я могу это сделать?

PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
BEGIN
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END;
END;




PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF....
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END IF
END;

Ответы [ 3 ]

1 голос
/ 24 сентября 2010

Самый простой способ сделать это - логически отделить текст на основе вхождения PROCEDURE:

undef $/;
my $line = <DATA>;
my @proc = split /(?=^PROCEDURE )/m, $line;
use Data::Dumper;
die Dumper \@proc;
0 голосов
/ 24 сентября 2010

Попробуйте это:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

undef $/;
my $line = <DATA>;
my @procedures = split /(?=PROCEDURE)/, $line;
print Dumper(\@procedures);

__DATA__
PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
BEGIN
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END;
END;




PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF....
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END IF
END;

Выход:

$VAR1 = [
          'PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
BEGIN
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END;
END;




',
          'PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF....
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END IF
END;'
        ];
0 голосов
/ 24 сентября 2010

Для быстрого и грязного решения поиска токена ПРОЦЕДУРА может быть достаточно для разделения кодовых блоков. Но если вы хотите, чтобы это было зрелым решением, вы должны действительно попытаться найти (или написать) парсер для PL / SQL и использовать его вместо этого. В противном случае вы не сможете обработать вхождения ПРОЦЕДУРЫ токена внутри строк или комментариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...