【问题标题】:How to make Oracle error messages more verbose?如何使 Oracle 错误消息更详细?
【发布时间】:2009-01-23 16:24:32
【问题描述】:

让我发疯的消息是ORA-01008 - Not all variables bound

有没有办法知道我拼错了 42 个可能的变量名中的哪一个而不用盯着显示器直到我的眼睛都出来了?

更新:我使用ADO.NET 来访问数据库。正如@Justin Cave 所建议的那样,它可能确实在Oracle 异常中丢失了一些信息。但我敢肯定,即使在 SQL Plus 中,参数名称也不会出现。

【问题讨论】:

  • 我也很想知道这个问题的答案。我的默认假设是“这是企业软件,你搞砸了”,但希望我是错的……不过,出于这个原因,我永远不会再使用 Oracle。
  • +1,好问题。 @meador,如果您想知道答案,则表明这是一个好问题。投票吧!
  • DCookie:赞成投票的好电话...我以为我已经这样做了。我的错。
  • 你能举个例子来说明你打电话的方式吗?有不同的方式和驱动因素。

标签: oracle ado.net messages


【解决方案1】:

一般来说,Oracle 会提供任何错误的行号和列号,但取决于您使用的特定 API(除非您碰巧正在编写 OCI 应用程序,这可能不太可能)是否以及如何出现这些错误调用 API。由于答案很可能最终是特定于 API 的,那么您使用的是什么 API,发生错误时您的代码是什么样的(即 JDBC、ODBC、OLE DB 等)?

例如,如果我编写了一个变量名拼写错误的 PL/SQL 块,SQL*Plus 将在错误消息之外报告错误的行号和列号。另一方面,许多 API 默认只会报告 PLS-00201 错误。

SQL> declare
  2    i integer;
  3  begin
  4    j := 1;
  5  end;
  6  /
  j := 1;
  *
ERROR at line 4:
ORA-06550: line 4, column 3:
PLS-00201: identifier 'J' must be declared
ORA-06550: line 4, column 3:
PL/SQL: Statement ignored

同样,如果你执行一个带有无效变量名的 SQL 语句,SQL*Plus 将获取列和行的位置,并在有问题的字符下放一个 *,即

SQL> create table a( col1 number );

Table created.

SQL> insert into a( colN ) values ( 1 );
insert into a( colN ) values ( 1 )
               *
ERROR at line 1:
ORA-00904: "COLN": invalid identifier

大多数 PL/SQL IDE(TOAD、SQL Developer 等)都会通过在后台询问适当的 OCI API 来做类似的事情。然而,具体如何完成这将取决于 API。

【讨论】:

  • 正确。因此,您不能让 Oracle 变得更冗长,但您可以选择您的工具,让冗长的内容传达给您。如果你的工具是固定的,你就可以记录语句:)
【解决方案2】:

我不知道有什么方法可以让 Oracle 使错误更具体。也许将来的某个版本会改进此错误消息。

不过,除了盯着它看,您还可以尝试其他方法。例如,一次将 SQL 语句中的每个变量转换为文字,直到错误消失。如果可能,生成变量名称列表而不是手动输入。

【讨论】:

  • 基本上是“分而治之”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2010-09-29
  • 2016-08-14
  • 1970-01-01
  • 2016-08-07
  • 2018-12-12
相关资源
最近更新 更多