插入Oracle数据库时返回CGI中的代码

时间:2016-12-21 21:31:38

标签: sql oracle perl cgi

我有一个Perl CGI脚本,可以将value1value2value3插入Oracle数据库

eval {

    my $sth = $dbh->prepare(
        "insert into $table (COLUMN1, COLUMN2, COLUMN3) VALUES ('$value1','$value2','$value3')"
    );

    if ( defined( $sth ) ) {
        $sth->execute();
    }
    else {
        die( "Sth not defined" );
    }
};

print "Successfully inserted";

对于唯一的value1,value2,value3我插入这些值没有问题,但如果我尝试插入重复的值,我会得到

  

执行()

时违反了唯一约束错误

在日志中。但该页面仍然显示已成功插入。

所以我在想是否可以获得

的返回码
$sth->execute();

然后我可以使用该信息来显示它是否已成功插入或显示是否遇到错误。

或者,在插入重复数据时,还有其他方法可用于显示错误吗?

1 个答案:

答案 0 :(得分:3)

它对CGI代码中的die没用。你应该生成一个HTML响应页面,只是放弃一半是不是一件有用的事情

同样,您不希望在yuour DBI连接中启用RaiseError选项,如果遇到错误,只需向DBI询问die

如果您未启用die或启用RaiseError,则不需要eval

启用PrintError非常有用,它使DBI使用warn来记录相同的消息。这将出现在服务器日志文件中以供以后诊断

$sth->execute的调用会在失败时返回 false 值,并且在此基础上您可以打印错误消息以及错误字符串

您还应该在prepare语句中使用占位符。只需将问号?代替列值并将调用中的实际值传递给execute

即可。

逻辑应该看起来像这样

my $dbh = DBI->connect($dsn, $user, $pass, { RaiseError => 0, PrintError => 1 });

my $sth = $dbh->prepare( "insert into $table (COLUMN1, COLUMN2, COLUMN3) VALUES (?, ?, ?)" );

if ( $sth ) {

    my $ret = $sth->execute( $value1, $value2, $value3 );

    if ( $ret ) {
        print "Successfully inserted\n";
    }
    else {
        print "Insert failed:\n";
        print $sth->errstr, "\n";
    }
}
else {
    print "Failed to prepare statement handle:\n";
    print $dbh->errstr, "\n";
}