SQLplus ORA 错误解析

Posted

技术标签:

【中文标题】SQLplus ORA 错误解析【英文标题】:SQLplus ORA errors parsing 【发布时间】:2013-01-29 07:50:25 【问题描述】:

我正在从 bash 运行几个 sql 脚本。我想在添加提交之前查看 ORA 错误的摘要。像这样的:

#!/bin/bash
S_DB2_CONNECTOR=""
echo "My statement"
SQL_STM=$( echo "UPDATE ..." | sqlplus login/pass@bd );
echo "Output:"
echo "$SQL_STM"
echo "searching for errors...."
echo $LOG_VAR | grep "ORA"
echo "before commit"
wait 1000
echo "COMMIT;" | sqlplus -s login/pass@bd;

但这不起作用,因为 sqlplus 会话被破坏并且!SURPRISE! sqlplus 添加了 SQL_STM 执行后的自动提交功能。

如何在提交前解析 sqlplus 输出的 ORA-/ST-errors?在此终端屏幕中首选。

也许我不需要 bash 来解析,而 sqlplus 可以为我做吗? (因此会话状态将被保留)。

【问题讨论】:

这篇文章可能对某人有用。 ***.com/questions/4937108/… 【参考方案1】:

如果你想在 ORA 代码的情况下回滚/做一些额外的事情,那么在 SQL*PLUS 会话中做这一切。

即将其作为脚本运行。

set serverout on
begin
  update...;

exception
  when others -- others is a catch all, you can catch specific codes too
  then 
    rollback;
    dbms_output.put_line('Error!');
    dbms_output.put_line(sqlerrm); -- prints full error string
end;
/

如果您只是想向 bash 发出一条 sql 语句失败的信号,您可以在 sql*plus 中设置为第一件事。 whenever sqlerror exit sql.sqlcode(或whenever sqlerror (exit -1等)改为(见here)。这将在第一个错误时停止,并使用适当的返回代码返回到您的 schell 脚本。

您可以嵌套块,例如:

begin
  update ..;
  begin
    select id into v_id
      from tab
     where ...;
  exception
    when no_data_found
    then
      null;-- ignore that we didnt find a row
  end;
  -- if the select fails, we continue from here..
  delete...;
  begin
    savepoint mysave;
    your_proc(...);
  exception
   when others
   then
     rollback to mysave; -- of the call to your_proc fails, lets just toll that back alone
  end;

end;

等等

如果您需要它是交互式的,您可以执行类似 (dbms_alert)[http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_alert.htm#CHDCFHCI] 之类的操作:

sqlplus /<<EOF | tee -a my.log
set feedback on verify on serverout on 
-- IE YOUR CODE HERE..
select * from dual;
begin
  null;
end;
/
-- END OF YOUR CODE..
-- now lets wait for an alert from another session:
declare
  v_message  varchar2(32767);
  v_status   number;
begin
  DBMS_ALERT.REGISTER('should_i_commit');
  DBMS_ALERT.WAITONE('should_i_commit', v_message, v_status); -- there is a timeout parameter you can set too
  if (v_message = 'Y')
  then
    dbms_output.put_line('I committed');
    commit;
  else
    dbms_output.put_line('I rolled back');
    rollback;
  end if;
end;
/
EOF

然后在另一个会话中您可以发出:

SQL> exec dbms_alert.signal('should_i_commit', 'N');

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

【讨论】:

我想自己做决定。错误不是自动的。一些 ORA- 错误是可以的,有些则不是。感谢您的建议。我找到了这个docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve052.htm 不幸的是,我的 sql 知识比 bash 差。你能解释一下,这段代码究竟会做什么? dbms_output.put_line(sqlerrm);它会执行 sql 代码(只是正常 + 在 SQL 提交请求之前输出所有 ORA 错误? @idobr 如果语句失败,它将直接落入when others 块,并运行其中的任何内容(即它不会再处理开始部分中的任何代码)。 感谢您的关注。因此,即使由于可以忽略不计的错误,它也会中断脚本执行,不是吗?我明白了我可以指定的一点,哪些错误代码很重要。我可以将所有错误都写到某个地方(不中断),然后在提交决定之前将其输出吗? @idobr 是的,您可以通过嵌套捕获该错误的开始/结束块轻松“忽略”琐碎的错误。例如开始更新... ;开始从选项卡中选择 id 到 void;当 no_data_found 然后为 null 时出现异常;结尾;删除……;……结束;。在您的选择失败且未找到任何行的情况下,执行将继续删除(因为只有内部开始结束块失败。(我正在旅行,所以目前无法正确更新我的答案,但我可以添加更多如果你愿意,很快就会有一个复杂的例子)

以上是关于SQLplus ORA 错误解析的主要内容,如果未能解决你的问题,请参考以下文章

在登陆sql plus时老是出现错误提示,无法解析指定的连接标识符,是啥原因?

sqlplus/rman登录报权限错误ORA-01031/ORA-04005/0RA-00554

sqlplus连接登录数据库时,出现 ORA-28009错误(转)

oracle sqlplus登陆提示ORA-12560?

无法通过服务名使用 SQLPLUS 连接到 oracle 数据库

转 sqlplus执行sql报错:ORA-01756: