【问题标题】:Error executing SQL using Perl使用 Perl 执行 SQL 时出错
【发布时间】:2017-10-14 05:07:45
【问题描述】:

我正在尝试执行找到 SQL 中涉及的表列表的开源代码。

我正在处理Retrieve table names from Oracle queries

我对表达式和命令有所了解并尝试了。

我的执行细节:

  1. GetTable.pl文件
    和链接里的一样

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

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

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

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;

【问题讨论】:

    标签: oracle perl unix


    【解决方案1】:

    作为程序员需要学习的两个重要技能是 a) 准确地遵循说明和 b) 仔细阅读错误消息。

    您从运行GetTable.pl 开始。但是该程序需要一个参数(要分析的 SQL 文件的名称),并且错误消息试图告诉您这一点。

    我不知道为什么,但是您决定让 Perl 运行您的 SQL 文件,而不是按照错误消息告诉您的操作(本来应该运行 perl GetTable.pl test.sql)。

    您收到的第二条错误消息是 Perl 编译器试图理解您要求它运行的 SQL。但是 Perl 编译器不理解 SQL,它理解 Perl。因此,它感到困惑也就不足为奇了。

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

    $ perl GetTable.pl test.sql

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多