我有很多很長的sql文件,其中包括一堆離散的sql命令。基本上這些文件會丟失,然後通過一些修改重新創建一堆存儲過程。針對SQL腳本的Perl解析
我需要解析出來,以獲得單個降/創建scrips。
Perl是我的第一選擇,因爲它是擅長解析......但我不是很有經驗的Perl ...
這裏是我到目前爲止(請注意我基本上重新寫我的原未遂):
#!/usr/bin/perl
use strict;
use warnings;
my $use = "";
my $use = "USE mydatabase;";
undef $/; # Enable 'slurp' mode
open my $fh, '<', 'AlterSprocs.sql' or die;
$/= 'DROP PROCEDURE';
while (my $row = <$fh>) {
$n ++;
$row = $use . "\n" . "GO" . "\n" . 'DROP PROCEDURE' . $row . ';';
my $find = 'DROP PROCEDURE;';
my $replace = "";
$row =~ s/$find/$replace/g;
open (MYFILE, '>', $n);
print MYFILE $row;
close (MYFILE);
我解析文本看起來像:
Use mydatabase;
GO
Drop Procedure [blah1]
Create Procedure [blah1]
[Sql stuff]
Drop Procedure [blah2]
Create Procedure [blah2]
[Sql stuff]
[repeat blah3....blah4...etc...etc..]
這給我的文件命名爲1,2,3,等在他們離散的存儲過程。我不得不做一些奇怪的補充,並用文本取代它來正確...但它的工作原理。最後一個文件將以一個額外的「;」結尾但是...應該是安全的。
主要的問題我現在是,第一檔是因爲我的「DROP PROCEDURE」解析的方式空。我試圖通過在while循環中放入一個if/else來處理這個問題,除了設置n ++之外,如果n = 0,它將不會執行任何操作;
if ($n = 0)
{$n++;}
else {all the other stuff I actually want to do}
,但是這隻創建了一個文件(名爲1)。
我還需要拉出了名的存儲過程,所以我可以用它來命名輸出文件,而不是$ N,但我認爲,這將是有些簡單的,因爲它是第一行。
似乎有不是一個辦法讓你從包含在您的文章腳本顯示輸出。 –
如果你知道Perl,Perl只能解析它!否則,你可能會更好地使用你更熟悉的語言。 –
我甚至沒有看到任何嘗試迭代多個匹配。 –