0

asp.net と oracleclient コネクタを使用して oracle 10g テーブルを更新しようとしています

SQL 構文は次のとおりです。

UPDATE tableX set PURPOSE = 'T' where REQUEST_ID = '2543'

これはエラーをスローします:

ORA-00904: "PURPOSE": invalid identifier

別の列を更新しようとすると

UPDATE tableX set DELIVERY_COMMENTS = 'T' where REQUEST_ID = '2543'

すべて正常に動作します。

PURPOSE 列は存在し、PURPOSE 列に情報を挿入できます。

なぜこれが機能しないのか、誰にもアイデアがありますか?

4

2 に答える 2

1

PURPOSE は予約された単語ではないと思いますが、その場合は二重引用符で囲む必要があります。" set "PURPOSE" = 'T'.

列名は、小文字または大/小文字混合の場合があります。実行select * from tableX where rownum < 2して、SqlPlus が列名を表示していることを確認します。列名の大/小文字を判別する決定的な方法は、次のとおりです。

   select c.owner, c.column_id, c.column_name
     from all_tab_cols c
     where c.table_name = 'TABLEX'
     order by  c.owner, c.column_id

「TABLEX」はすべて大文字であることに注意してください。PURPOSE がすべて大文字でない場合は、Oracle が大文字と小文字を区別して扱うように、二重引用符で囲む必要があります。

于 2011-02-24T17:14:52.793 に答える
1

わかりました...これが答えです

オペレーターエラー

user2 としてデータベースに接続していたため、user2 スキーマに入れられました。user2 スキーマには、user2.target_table という名前の user1.target_table を使用するビューがあります。問題は、ビューが次のように設定されていることでした

「user1.target_tableからfield1、field2を選択」

user1.target_table に新しいフィールドが追加されましたが、user2 スキーマのビューは更新されず、変更が反映されませんでした。

UPDATEステートメントを完全に修飾することでエラーを発見しました

UPDATE user1.target_table set PURPOSE = 'T' where field1 = '1'

更新ステートメントはチャンピオンのように機能しました。

教訓.....あるスキーマで、別のスキーマで使用されている名前のビューを作成しないでください。

これで私のPEBKACが明確になることを願っています(キーボードと椅子の間に問題があります)

于 2011-02-28T14:52:34.500 に答える