使用Perl执行SQL时出错

-5 unix oracle perl

我正在尝试执行开源代码,该代码可以找到SQL中涉及的表列表.

我正在研究从Oracle查询中检索表名.

我在某种程度上理解了表达式和命令并尝试了它.

我的执行细节:

  1. GetTable.pl文件
    与链接相同

  2. test.sql文件
    我没有使用链接中的那个.相反,我只有一个SQL用于测试.
    SELECT emp_name FROM load_tables.temp;

  3. 草莓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)

有人可以帮我执行吗?我不确定代码是否有问题,因为我可以看到两个人已成功执行.

Perl代码

#!/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)

Dav*_*oss 5

作为程序员学习的两个重要技能是:a)遵循指令的准确性和b)仔细阅读错误消息.

你开始跑步了GetTable.pl.但该程序需要一个参数(要分析的SQL文件的名称),并且错误消息试图告诉您.

我不知道为什么,但不是做错误消息告诉你做的事情(本来应该运行perl GetTable.pl test.sql),你决定让Perl运行你的SQL文件.

您收到的第二条错误消息是Perl编译器试图理解您要求它运行的SQL.但是Perl编译器不理解SQL,它理解Perl.所以它让人感到困惑并不奇怪.

要修复它,请执行建议的第一条错误消息 - 运行命令

$ perl GetTable.pl test.sql