我正在尝试执行开源代码,该代码查找SQL中涉及的表列表。
我正在研究Retrieve table names from Oracle queries。
我在某种程度上理解了表达式和命令并尝试了它。
我的执行细节:
GetTable.pl
档案
与链接相同
test.sql
档案
我没有使用链接中的那个。相反,我只有一个SQL用于测试
SELECT emp_name FROM load_tables.temp
;
在Strawberry Perl执行
我尝试了以下
$ perl GetTable.pl
Usage : GetTable <sql query file>
$ perl test.sql
Can't locate object method "FROM" via package "load_tables" (perhaps you forgot to load "load_tables"?) at test.sql line 1
有人可以帮我执行吗?我不确定代码是否有问题,因为我看到有两个人已成功执行。
#!/usr/bin/perl
use warnings;
#Function which gets the table names and formats and prints them.
sub printTable {
my $tab = shift;
$tab =~ s/,\s+/,/g;
$tab =~ s/\s+,/,/g;
my @out = split( /,/, $tab );
foreach ( @out ) {
$_ =~ s/ .*//;
print $opr, $_, "\n";
}
}
# Function which gets the indivdual queries and separtes the table
# names from the queries. Sub-Queries, co-related queries, etc..
# will also be handled.
sub process {
local $opr;
my $line = shift;
$line =~ s/\n/ /g;
if ( $line =~ m/^\s*(select|delete)/i ) {
if ( $line =~ m/^\s*select/i ) {
$opr = "SELECT: ";
}
else {
$opr = "DELETE: ";
}
if ( $line =~ m/from.*where/i ) {
while ( $line =~ m/from\s+(.*?)where/ig ) {
&printTable( $1 );
}
}
elsif ( $line =~ m/from.*;/i ) {
while ( $line =~ m/from\s+(.*);/ig ) {
&printTable( $1 );
}
}
}
elsif ( $line =~ m/^\s*update\s+(\w+)\s+/i ) {
$opr = "UPDATE: ";
&printTable( $1 );
}
elsif ( $line =~ m/^\s*insert\s+into\s+(\w+)\s+/i ) {
$opr = "INSERT: ";
&printTable( $1 );
}
}
#The main function which reads the files and reads the
#query into a variable and sends it to process function.
if ( @ARGV != 1 ) {
print "Usage: GetTable <sql query file>\n";
exit 1;
}
open QFILE, $ARGV[0] or die "File $ARGV[0]: $! \n";
my $flag = 0;
my $query = "";
my $conds = "select|insert|update|delete";
while ( <QFILE> ) {
next if ( /^$/ );
if ( $flag == 1 ) {
$query .= $_;
if ( /;\s*$/ ) {
$flag = 0;
&process( $query );
}
}
elsif ( /^\s*($conds).*;\s*/i ) {
&process( $_ );
}
elsif ( /^\s*($conds)/i ) {
$flag = 1;
$query = $_;
}
}
close QFILE;
答案 0 :(得分:5)
作为程序员学习的两个重要技能是:a)遵循说明的准确性和b)仔细阅读错误信息。
您首先运行GetTable.pl
。但是该程序需要一个参数(要分析的SQL文件的名称),并且错误消息试图告诉您。
我不知道为什么,但不是做错误消息告诉你要做的事情(本来就是运行perl GetTable.pl test.sql
),而是决定让Perl运行你的SQL文件。
您收到的第二条错误消息是Perl编译器试图理解您要求它运行的SQL。但Perl编译器并不了解SQL,它理解Perl。所以它感到困惑并不奇怪。
要修复它,请执行建议的第一条错误消息 - 运行命令
$ perl GetTable.pl test.sql