0

SQL::Parser で解析している更新ステートメントがあります

uPdate scott.emp 
set ename='SCT%',emp_date=TO_DATE('04/16/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'),empno='15645' 
WHERE dept=20 and ename IN(select ename from emp where empno='1111');

しかし、TO_DATE関数はSQL::Parserで解析できないため、エラーがスローされます:

Incomplete SET clause! at ./post_audit.pl line 173
Incomplete SET clause! at ./post_audit.pl line 173

このようなエラーをキャッチするにはどうすればよいですか? eval はトリックを行いますか? 同じための適切なドキュメントが見つかりませんでした。

SQL ステートメントを解析するコード:

   +12  use SQL::Parser;

   +34  my $statement = "uPdate scott.emp set ename='SCT%',emp_date=TO_DATE('04/16/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'),empno='15645' WHERE dept=20 and ename IN(select ename from emp where empno='1111')";

  +172      my $parser = SQL::Parser->new('AnyData', {RaiseError=>1} );
  +173      $parser->parse($statement);

ステートメントの解析中に、173 行目でエラーがスローされます。

4

1 に答える 1

1

「TO_DATE」関数がエラーの原因だとは思いません。

SQL::Parser モジュールのソース コードには次のように書かれています。

my @sets = split /,/,$set_string;
my(@cols,@vals);
for(@sets) {
    my($col,$val) = split / = /,$_;
    return $self->do_err('Incomplete SET clause!') if !$col or !$val;

=正規表現の " " はスペースで囲まれていることに注意してください: " / = /"

したがって、等号をスペースで囲む必要があります。

set ename='SCT%'

する必要があります

set ename = 'SCT%'

等...


それを処理する限り、コンストラクターで設定したエラーフラグによって異なります。

    sub do_err {
        ...
        warn $err if $self->{"PrintError"};
        die if $self->{"RaiseError"};
        return undef;
    }
  • RaiseErrorフラグを設定すると、コードは停止します。

    my $parser = SQL::Parser->new('AnyData', {RaiseError=>1} );
    

    eval {}そのため、$parser->parse()呼び出しをラップして、$@エラー文字列の値を確認する必要があります。

  • フラグを設定PrintErrorすると、警告が表示されます。SOまたはPerlMavenで示されているように、警告シグナルをトラップすることで警告をキャッチできます。

  • どちらも設定しないと、「false」parse()の戻り値が返されますが、エラーの原因はわかりません。

チェックすればparse()、これはのPODでカバーされています。

$success のような変数で parse() の戻り値をチェックすることに加えて、DBI スクリプトで行うように、PrintError および RaiseError 属性を使用できます。

  • PrintError が true の場合、SQL 構文エラーは警告として STDERR に送信されます (つまり、STDERR がリダイレクトされている場合は画面またはファイルに送信されます)。これはデフォルトで true に設定されています。つまり、特にオフにしない限り、すべてのエラーが報告されます。

  • RaiseError が true の場合、SQL 構文エラーによりスクリプトが停止します (つまり、スクリプトは eval でラップされない限り終了します)。これはデフォルトで false に設定されています。つまり、特にオンにしない限り、SQL 構文エラーがあってもスクリプトは動作し続けます。

于 2013-05-14T14:08:57.940 に答える