我正在尝试执行开源代码,该代码可以找到SQL中涉及的表列表.
我正在研究从Oracle查询中检索表名.
我在某种程度上理解了表达式和命令并尝试了它.
我的执行细节:
GetTable.pl文件
与链接相同
test.sql文件
我没有使用链接中的那个.相反,我只有一个SQL用于测试.
SELECT emp_name FROM load_tables.temp;
草莓Perl执行
我尝试了以下内容
$ perl GetTable.pl
Usage : GetTable <sql query file>
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
有人可以帮我执行吗?我不确定代码是否有问题,因为我可以看到两个人已成功执行.
#!/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;
Run Code Online (Sandbox Code Playgroud)
作为程序员学习的两个重要技能是:a)遵循指令的准确性和b)仔细阅读错误消息.
你开始跑步了GetTable.pl.但该程序需要一个参数(要分析的SQL文件的名称),并且错误消息试图告诉您.
我不知道为什么,但不是做错误消息告诉你做的事情(本来应该运行perl GetTable.pl test.sql),你决定让Perl运行你的SQL文件.
您收到的第二条错误消息是Perl编译器试图理解您要求它运行的SQL.但是Perl编译器不理解SQL,它理解Perl.所以它让人感到困惑并不奇怪.
要修复它,请执行建议的第一条错误消息 - 运行命令
$ perl GetTable.pl test.sql
| 归档时间: |
|
| 查看次数: |
55 次 |
| 最近记录: |