【问题标题】:Catch sql-loader exception while executing sql-loader as command in perl在 perl 中将 sql-loader 作为命令执行时捕获 sql-loader 异常
【发布时间】:2016-10-10 08:59:40
【问题描述】:

我们正在 perl 中执行 sql-loader,使用如下命令:
`sqlldr $db_arg control=$ctl data=$data log=$log bad=$bad`;

但是这样我们无法找到sql-loader是否抛出异常。

例如:- 即使数据有 30,000 条记录,并且在加载 1,000 条记录后遇到问题,我们也只会收到一条消息,指出已加载 1,000 条记录。

有没有办法查出sql-loader有没有抛出异常,具体是什么异常。

注意:计算数据文件中的行数变得非常昂贵,因为该文件必须在一些旧的 Windows Server 和 Unix 服务器中执行,因此不能使用`wc`

【问题讨论】:

  • 如果你想要sqlldr的退出码,你应该使用system(),然后检查$?

标签: perl sql-loader backticks


【解决方案1】:

如果您想捕获程序写入 STDOUT 的任何内容,建议使用反引号运行外部程序。如果您没有捕获反引号返回的数据(在标量变量或数组中),那么您使用的工具有误。

如果你想得到程序的返回值,那么你需要使用system()来代替。但是从您从system() 返回的值中提取外部程序的实际返回值需要一些工作。 documentation for system() 是这样说的:

返回值是等待调用返回的程序退出状态。要获得实际的退出值,请右移八位(见下文)。

提到的“下面”大概就是这个代码示例(实际上是检查$?而不是system()返回的值):

if ($? == -1) {
    print "failed to execute: $!\n";
}
elsif ($? & 127) {
    printf "child died with signal %d, %s coredump\n",
        ($? & 127),  ($? & 128) ? 'with' : 'without';
}
else {
    printf "child exited with value %d\n", $? >> 8;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多