How to catch SQL::Parser errors in Perl -


i have update statement parsing 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'  dept=20 , ename in(select ename emp empno='1111'); 

but since to_date function cannot parsed sql::parser hence throws error:

incomplete set clause! @ ./post_audit.pl line 173 incomplete set clause! @ ./post_audit.pl line 173 

how catch such errors? eval trick? did not find proper documentation same.

code parse sql statements:

   +12  use sql::parser;     +34  $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' dept=20 , ename in(select ename emp empno='1111')";    +172      $parser = sql::parser->new('anydata', {raiseerror=>1} );   +173      $parser->parse($statement); 

error thrown @ line 173 while parsing statement.

i don't think "to_date" function source of error.

the source code sql::parser module says:

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; 

note "=" surrounded spaces in regex: "/ = /"

therefore, should space-surround equals signs:

set ename='sct%' 

should be

set ename = 'sct%' 

etc...


as far handling it, depends on error flags set in constructor:

    sub do_err {         ...         warn $err if $self->{"printerror"};         die if $self->{"raiseerror"};         return undef;     } 
  • if set raiseerror flag, code die.

    my $parser = sql::parser->new('anydata', {raiseerror=>1} ); 

    as such, need wrap eval {} around $parser->parse() call, , check $@ value error string.

  • if set printerror flag, warn you. can catch warnings trapping warning signal, shown here on so or on perlmaven.

  • if don't set either one, "false" return value parse() no idea of error was.

this covered in parse()'s pod if check it:

in addition checking return value of parse() variable $success, may use printerror , raiseerror attributes in dbi script:

  • if printerror true, sql syntax errors sent warnings stderr (i.e. screen or file if stderr has been redirected). set true default means unless turn off, errors reported.

  • if raiseerror true, sql syntax errors cause script die, (i.e. script terminate unless wrapped in eval). set false default means unless turn on, scripts continue operate if there sql syntax errors.


Comments

Popular posts from this blog

jquery - How can I dynamically add a browser tab? -

node.js - Getting the socket id,user id pair of a logged in user(s) -

keyboard - C++ GetAsyncKeyState alternative -