【发布时间】:2017-04-28 11:52:22
【问题描述】:
我正在使用 powershell 运行 sqlplus,我希望 PowerShell 在脚本运行后检测是否有错误并执行一些操作,而不是我查看结果文件。
& 'sqlplus' 'system/myOraclePassword' '@Test' | out-file 'result.txt';
通常在DOS下,命令遇到错误时会出现%errorlevel%,不知PowerShell中是否有类似的东西?
当然,我可以自己阅读日志文件,但有时,事情太常规了,我可能会忘记。
我的 Test.sql:
select level from dual
connect by level<5;
select 10/0 from dual;
quit;
显然存在除以零错误。 result.txt 会捕获它,但我希望 powershell 也能检测到它
SQL*Plus:2017 年 4 月 27 日星期四 16:24:30 发布 12.1.0.2.0 生产 版权所有 (c) 1982、2014,甲骨文。版权所有。 上次成功登录时间:Thu Apr 27 2017 16:17:34 -04:00 连接到: Oracle Database 12c 企业版 12.1.0.2.0 - 64 位生产 具有分区、OLAP、高级分析和真实应用程序测试选项 等级 ---------- 1 2 3 4 从双选择 10/0 * 第 1 行的错误: ORA-01476: 除数等于零powershell语句执行后会不会像DOS一样返回errorlevel?
我试过了:
& 'sqlplus' 'system/myOraclePassword' '@Test' | out-file 'result.txt';
if (errorlevel 1)
{ write-host error;
}
else
{ write-host ok;
}
但这导致语法错误?
errorlevel : 术语“errorlevel”未被识别为 cmdlet 的名称, 函数、脚本文件或可运行的程序。检查拼写 名称,或者如果包含路径,请验证路径是否正确并 再试一次。
在powershell中检查错误的正确方法是什么?
更新
我用过这个:
if ($LASTEXITCODE -ne 0 )
{
write-host error;
}
else
{
write-host ok;
}
【问题讨论】:
-
尝试用
if ($LASTEXITCODE -eq 1)替换if (errorlevel 1) -
您还需要将
whenever sqlerror exit failureorwhenever sqlerror exit 1添加到SQL 脚本的顶部,否则SQL*Plus 将在退出时正常退出,并且shell 不会知道有什么问题。但是您只能真正获得成功/失败,而不是实际错误(此处为 1476)-您可以exit sql.sqlcode但大多数外壳程序会将其包装在 256 处,这没有帮助... -
@AlexPoole:谢谢你,亚历克斯。知道了!!难怪
-
@AlexPoole:每当 sqlerror 退出失败到 sql 脚本顶部时,我很抱歉回到您的评论中。起初我认为它会解决问题,但仔细观察后,$LASTEXITCODE 仍然为 0,这意味着它要么没有收到来自 sql 的错误标志,要么 sql 不认为除以零是 sqlerror。你能帮我解释一下吗?
标签: powershell sqlplus