8

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

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

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

4

2 回答 2

2

通常,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。

于 2009-01-23T19:10:01.700 回答
1

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

但是,您可以尝试其他事情,而不仅仅是盯着它看。例如,一次将 SQL 语句中的每个变量转换为文字,直到错误消失。如果可能,请生成变量名称列表,而不是手动键入它们。

于 2009-01-23T16:51:56.953 回答