代码之家  ›  专栏  ›  技术社区  ›  IMil

如何使Oracle错误消息更详细?

  •  8
  • IMil  · 技术社区  · 16 年前

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

    我使用 ADO.NET 访问数据库。也许正如@Justin Cave所建议的那样,它确实会丢失一些甲骨文异常中的信息。但我确信参数名即使在sqlplus中也不会出现。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Justin Cave    16 年前

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

    如果SQL/PL中有一个拼写错误的行,则会在SQL/block中加上一个错误代码。另一方面,许多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/sqlide(TOAD、sqldeveloper等)都会通过询问合适的ociapi来完成类似的工作。然而,具体如何实现这一点,将取决于API。

        2
  •  1
  •   Dave Costa    16 年前

    不过,除了盯着它看,还有其他的事情你可以试试。例如,一次将SQL语句中的每个变量转换为文本变量,直到错误消失为止。如果可能,生成变量名列表,而不是手动键入它们。