使用Perl

时间:2017-05-15 12:04:05

标签: oracle perl unix

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

我正在研究Retrieve table names from Oracle queries

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

我的执行细节:

  1. GetTable.pl档案
    与链接相同

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

  3. 在Strawberry Perl执行

  4. 我尝试了以下

    $ 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;
    

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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

$ perl GetTable.pl test.sql