2017-11-29 3 views
0

CONTRACT_ID列がある行だけを返すのは簡単です。 CONTRACT_IDのデータ型はnumber(8)です。ORA-01722:数字の列のみ無効です。

CREATE OR REPLACE VIEW cid AS 
    SELECT * 
    FROM transactions 
    WHERE contract_id IS NOT NULL 
    AND LENGTH(contract_id) > 0; 

ビューは、私がORA-01722を取得した行〜2950までスクロールするまでうまく機能します。 Excelにデータをエクスポートしたい場合、ファイルは予想される〜20kではなく〜2950行しか取得できません。 これを引き起こしている可能性があり、この問題を解決するにはどうすればよいですか?

多くの感謝!

+1

'length()'は文字値を想定しており、数字に意味をなさない。それでは、あなたは正確に何をしようとしていますか? 'contract_idがnullでない'すでに値を含んでいないものをすべて削除します。 @Lostinsql。 –

+0

。 。 「取引」が見通しであれば、これが起こっていると想像することができます。 –

+0

@a_horse_with_no_name contract_idが空でないかヌルでない行だけを表示したいとします。 – Lostinsql

答えて

0

次はあなたが必要とするすべての結果を提供します。..あまりにも多くのSQLを書いた:

CREATE OR REPLACE VIEW cid AS 
    SELECT * 
    FROM transactions 
    WHERE contract_id IS NOT NULL 

あなたができないLENGTH()数 - 数はどちらかであるnullまたはあなたはドンので、それは、値の」この種の小切手が必要です。

LENGTH()に数値を渡すと、最初に文字列に変換されます(LENGTH(TO_CHAR(numbercolumn)))。 LENGTH() null文字列をチェックする必要はありません.Oracle NULL文字列と長さゼロの文字列は等価で、空文字列またはnullにはLENGTH()を呼び出しても0ではなくNULLが返されます(LENGTH(myNullStr) = 0は機能しません。それは0 = 0を比較していない、それはnull = 0を比較していると何かに比べてnullは常にfalseです)。

テーブル内の文字列がVARCHAR型ではなくCHAR型で、空の文字列をCHARに代入するとCHARの長さにスペースが入るしたがって、長さゼロの文字列ではありません。

+0

解決と説明をありがとう! – Lostinsql

0

まず、length()についての冗長条件を削除する必要があります。無意味です。私はそれがどのようにそのようなエラーを生成することができないのか分からないが、エラーがそれの後に消えたかどうかをチェックする。

いいえの場合は、star(*)をいくつかのフィールド名、たとえばcontract_idに置き換えます。もしそれがエラーを修正すれば - それはエラーソースをどこかで削除されたフィールドに指定します(たとえば、生成されたカラムが使用されている場合)。

私はエラーがまだ生き残っている可能性があると思います。もしそうなら、それを他のテーブルスペースに移動しようとしました。そして、行リストのRIDを格納するロギング関数の呼び出しをフィールドリストに追加しました。行がエラーを生成します。

関連する問題