为什么SQL错误不显示错误源?

为什么SQL错误不显示错误源?,sql,oracle,debugging,oracle-sqldeveloper,Sql,Oracle,Debugging,Oracle Sqldeveloper,在Oracle SQL developer中执行SQL代码时,是否可以找到发生错误的行或列 例如,假设您正在运行一行非常简单的代码 SELECT * FROM employeesTbl WHERE active = 1 但是由于某些原因,活动的是VARCHAR,并且有人已经进入/asd02进入该字段 您只会得到一个ORA错误,但它不会告诉您是哪一行引起的 有人知道这是为什么吗?您会收到一个错误,因为该字段是一个字符,而您假设它是一个数字。你不应该这么做。如果你想让字段是数字的,那么你必须有一个

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

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

SELECT * FROM employeesTbl WHERE active = 1
但是由于某些原因,活动的是VARCHAR,并且有人已经进入/asd02进入该字段

您只会得到一个ORA错误,但它不会告诉您是哪一行引起的


有人知道这是为什么吗?

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

我不确定Oracle为什么不告诉您是哪一行导致了错误,在物理上可能会像您在这里所做的那样,在一个简单的选择中使用。如果您正在连接表或使用转换函数(如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

这背后的原因是,一般来说,开发人员对sql、pl/sql等的支持非常糟糕。一个结果是pl/sql中的异常概念被彻底打破,oracle sql中的异常几乎毫无用处,几乎没有希望它在任何rdbms中都更好

我认为,这一切背后的原因是,数据库是一个双关语。很多公司和开发人员不时地改变了首选的主要开发语言C、C++、VB、java、C、Groovy、斯卡拉…但是他们很少更改数据库,可能是因为您仍然有旧数据库,没有机会迁移它们

这反过来意味着大多数数据库开发人员只知道一个数据库系统,所以他们看不到在其他系统中有什么可能。因此,对于开发人员来说,使数据库系统变得更可用几乎没有压力。

多行可能包含错误。为了使系统作为一种基于集合的语言保持一致,它应该返回所有包含错误的行,并且不是所有的行错误都是由相同的错误引起的

但是,计算整个错误集的计算成本可能会很高,而且系统知道对该查询进行任何进一步的计算都将导致失败,因此,当其他查询可以成功运行时,它表示浪费了资源


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

您可能需要一个“无推前”提示来确保这一点。仔细想想,您可以修改is_number函数代码,以便如果转换成功,它将返回转换后的数字,并为非数字输入返回null,并且重命名是合适的,因此如果_numberactive=1@David,你当然可以这样做。就我个人而言,我不会这么做,因为这是对一些错误的轻微掩饰。如果OP解决了这个问题,或者把他的号码作为字符串引用会更好。完全脱离主题,但是。。。is_编号“0”返回0。这意味着它不是一个数字。也许它应该为非数值返回NULL?@Ben yes确实。。。数据模型/代码已损坏。然而,更进一步的思考是,函数将是好的和可索引的。我的想法正是如此。想象一下:从大表格1中选择to_numbersome_char_字段,从大表格2中选择to_numbersome_char_字段;顺便说一句,这不是一个真正的问题,只是一个例子。我必须管理一个我没有创建的数据库,所以我经常遇到这种错误,我想知道调试的最佳方法,你知道吗?