3

OracleSQLDeveloperでSQLコードを実行するときにエラーが発生している行または列を見つけることは可能ですか?

たとえば、非常に単純なコード行を実行していると想像してください。

SELECT * FROM employeesTbl WHERE active = 1

しかし、何らかの理由で、activeはVARCHARであり、誰かがこのフィールドに「;!/asd02」を入力しました。

ORA-エラーが発生するだけですが、どの行が原因であるかはわかりません。

なぜこれなのか誰か知っていますか?

4

3 に答える 3

3

この背後にある理由は、一般的にsql、pl/sqlなどの開発者サポートは本当にひどいものであるためです。結果の1つは、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 に答える