3

在Oracle SQL developer中执行SQL代码时,是否可以找到发生错误的行或列?

例如,假设您正在运行一个非常简单的代码行

SELECT * FROM employeesTbl WHERE active = 1

但是由于某种原因,active 是 VARCHAR 并且有人在此字段中输入了“;!/asd02”。

你只会得到一个 ORA- 错误,但它不会告诉你是哪一行导致的。

有人知道为什么吗?

4

3 回答 3

3

这背后的原因是一般开发人员对 sql、pl/sql 等的支持真的很糟糕。一个结果是 pl/sql 中的异常概念确实被打破了,(oracle)sql 中的异常几乎是无用的,并且几乎没有希望它在任何 rdbms 中更好。

我认为这一切背后的原因是数据库是持久的野兽(双关语)。许多公司和开发人员不时更改首选的主要开发语言(C、C++、VB、Java、C#、Groovy、Scala ..)。但是他们很少更改数据库,可能是因为您仍然拥有旧数据库而没有机会迁移它们。

这反过来意味着大多数 DB 开发人员只知道一个合理的数据库系统,所以他们看不到其他系统中的可能性。因此,使数据库系统对开发人员更加可用几乎没有压力。

于 2012-05-09T11:44:57.647 回答
2

行可能包含错误。为了使系统保持一致(作为“基于集合”的语言),它应该返回所有包含错误的行 - 并非所有行错误都可能由相同的错误引起。

但是,计算整个错误集的计算成本可能很高——并且系统“知道”这个查询的任何进一步计算无论如何都会导致失败——所以当其他查询可以成功运行时,它表示资源浪费。

我同意将这种类型的报告作为一个选项打开会很好(尤其是在非生产环境中),但似乎没有数据库供应商这样做。

于 2012-05-09T12:24:50.980 回答
1

您会收到一个错误,因为该字段是一个字符并且您假设它是一个数字。哪个,你不应该这样做。如果您希望该字段是数字,那么您必须有一个数字字段!这是一般规则,所有非字符列都应该是正确的数据类型以避免此类问题。

我不确定为什么 Oracle 不告诉您是哪一行导致了错误,在物理上可以使用rowid您在此处的简单选择中的 。如果您要连接表格或使用转换功能to_number,如果可能的话,这将变得更加困难。

我想 Oracle 不想只部分实现某些东西,尤其是当这不是 Oracle 错误而是编码错误时。

要解决问题,请创建以下函数:

create or replace function is_number( Pvalue varchar2 
      ) return number is
    /* Test whether a value is a number. Return a number
       rather than a plain boolean so it can be used in
       SQL statements as well as PL/SQL.
       */

   l_number number;

begin

   -- Explicitly convert.
   l_number := to_number(Pvalue);

   return 1;

exception when others then
   return 0;

end;
/

运行以下命令以查找您的问题行:

SELECT * FROM employeesTbl WHERE is_number(active) = 0

或者忽略它们:

SELECT *
  FROM ( SELECT *
           FROM employeesTbl
          WHERE is_number(active) = 1 )
WHERE active = 1
于 2012-05-09T11:42:00.633 回答