Показаны сообщения с ярлыком oralce. Показать все сообщения
Показаны сообщения с ярлыком oralce. Показать все сообщения

среда, 28 октября 2009 г.

МНОГО редактирования

Бывает, откопаешь что-то свое гениальное, и аж стыдно становится:


my $bproc = 0;
my $bfunc = 0;
my $bout = 0;
my $bbody = 0;
my $inselect = 0;

sub checkpar {
$bout = 1 if(/\sout\s/ and $bproc == 1);
if($bbody == 1) {
print "declare\n" if (!/^begin$/);
$bbody = 0;
}
if(/\)/ and $bproc == 1) {
$bproc = 0;
$bbody = 1;
print;
print " returns void" if($bout == 0);
print " as \$\$" ;
}
elsif(/\)\s*return\s+(\S+)/ and $bfunc == 1) {
$bfunc = 0;
$bbody = 1;
s/return/returns/;
print;
print " as \$\$" ;
}
else {
print;
}
print "\n";
}

while(<>) {
s/\r\n//;
next if /^\s*(as|is)\s*$/;
$inselect++ if(/select/);
if($inselect != 0) {
s/^(\s*)([a-zA-Z_.0-9]+)(\s+)([a-zA-Z_.0-9]+)(\s*,\s*)$/$1$2$3as $4$5/;
s/^(\s*,\s*)([a-zA-Z_.0-9]+)(\s+)([a-zA-Z_.0-9]+)(\s*)$/$1$2$3as $4$5/;
}
$inselect-- if(/from/);
s/^(\s*from T_OBJ o), ([^\s]+\s+)([^\s]+)$/$1 left join $2$3 on o.ID=$3.ID/;
s/ and \S\.ID \(\+\)= \S\.ID//;
s/varchar2/varchar/g;
s/number/numeric/g;
s/nvl\(/coalesce\(/g;
s/c_pkgcore\.gt_cursor/refcursor/gi;
s/"ADD"/ADD/g;
s/substr\(t_pkgVOC\.fGet([^(]+)\(t_pkgVOC\.fGetVOC\(([^)]+)\), ([^)]+)\), 1, \d+\)/t_pkgVOC__fGetVOC$1\($2, $3\) as/g;
s/substr\(c_pkgCore\.fGetSysUser([^(]+)\(([^)]+)\), 1, \d+\)/c_pkgCore__fGetUser$1\($2\) as/ig;
s/substr\((.*), (\d+), (\d+)\)/substring\($1 from $2 for $3\)/g;
s/substr\((.*), (\d+)\)/substring\($1 from $2\)/g;
s/t_pkgVOC\./t_pkgVOC__/gi;
s/t_pkgObj\./t_pkgObj__/gi;
s/t_pkgView\./t_pkgView__/gi;
s/c_pkgCore\./c_pkgCore__/gi;
s/SQL%NOTFOUND/not found/gi;
if(/function\s+([^(\s]*)([^\n]*)/) {
$bfunc = 1;
$_ = "/* $1 */\ncreate or replace function t_pkgRpt__$1$2";
}
if(/procedure\s+([^(\s]*)([^\n]*)/) {
$bproc = 1;
$_ = "/* $1 */\ncreate or replace function t_pkgRpt__$1$2";
}
if(!/^\s+$/) {
checkpar;
}
}
print "\$\$ language plpgsql;\n\n";