職場で使える!30代エンジニアのoracleエラー対応

とある三流エンジニアが日々起きた出来事や今打ち込んでいることについて備忘録として残していきます。

oracle

SELECTした項目でUPDATEする際に発生する「ORA-01407:(ユーザ名.テーブル名.項目名)をNULLには更新できません。」

投稿日:

スポンサーリンク

今日は、

ORA-01407:(ユーザ名.テーブル名.項目名)をNULLには更新できません。

について、解説します。

 

開発中に

UPDATE文を作成する際の基本公式は、

UPDATE テーブル名 SET 項目名=値

となりますが、

UPDATE対象の項目がたくさんある場合などちょっと面倒です。

 

そこでよく使われるのが、

SET句にSELECT文を書いてしまう手法です。

UPDATE tableA A SET (A.項目1, A.項目2, A.項目3) = (SELECT B.項目1, B.項目2, B.項目3 FROM table B where A.key = B.key AND B.項目4 = ‘1’);

のようになります。

 

このように、

テーブルAとテーブルBを結合し、テーブルBのとある項目でテーブルAの項目を更新したい時によく使う手法です。

 

しかし、テーブルBのSELECT結果(レコード件数)がテーブルAのレコード件数より少ない場合、

テーブルAにはNULLで埋めようと更新を試みるようです。

 

これにより、ORA-01407が発生します。

対処として一番簡単なのは、

UPDATE tableA A SET (A.項目1, A.項目2, A.項目3) = (SELECT B.項目1, B.項目2, B.項目3 FROM table B where A.key = B.key)

AND exists (SELECT 0 FROM table B where A.key = B.key AND B.項目4 = ‘1’);

のように

existsを付けて、更新レコード(テーブルA)とSELECTレコード(テーブルB)の件数を揃えてあげることです。

スポンサーリンク
にほんブログ村 ライフスタイルブログ 40代 自分らしさへ
にほんブログ村
にほんブログ村 ネットブログ Googleへ
にほんブログ村
にほんブログ村 IT技術ブログ Oracleへ
にほんブログ村

-oracle
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

開発中によく発生する「ORA-12012:ジョブstringの自動実行エラーが発生しました」対処法

今日は、 ORA-12012 について、解説します。   当エラーは、 自動実行ジョブが失敗した場合に発生するエラーです。   自動実行したジョブって何? と思われる人もいるかと思 …

ORA-12560:「TNS: プロトコル・アダプタ・エラーが発生しました」対処法

まずは設定を見直してください。   今日は、 「ORA-12560」 についてです。   初期構築時によく見られるエラーです。   接続先の設定が間違っていることが多いで …

初心者が嵌るORA-01403:「データが見つかりません」の原因とは?

見ての通り、データが見つからない。 と言う至ってシンプルなエラー。   しかし、単純だからと言って侮ってはいけない。 このエラー、 何もSELECT時のみに発生するとは限らない。 UPDAT …

最速で「ORA-12154:TNS:サービス名を解決できませんでした。」を解決する方法

今日は ORA-12154 について、解説します。   tnsnames.ora構成ファイルに指定されたネット・サービス名が 見つからない時に発生するエラーです。 この場合の多くは、 接続の …

開発中によく発生するORA-06512: string行stringの対処について

本日は、 ORA-06512 について、解説いたします。   ORA-06512: string行string 原因: 通常、これはメッセージ・スタックの最後で、 PL/SQL内のソースコー …