職場で使える!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

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

関連記事

OpenOfficeで発生する「ORA-00933:SQLコマンドが正しく終了されていません」について

社内などのデータベースから ODBC接続でデータを抽出する場合、 データベースのリンクを作成し 「テーブル」で全テーブル表示はできるものの、 「クエリ」で取得しようとすると、 『OpenOfficeで …

no image

ORA-26026: 一意索引○○は初期状態では使用不可です。

安心してください!すぐ直ります❗ 今日は、 ORA-26026 です。   この手のエラーの原因は、 SQL*Loaderなどで同一キーデータが2件insert してしまっている可能性大です …

ORA-00942: 「表またはビューが存在しません。」対処法

基本的には読んで字のごとく、 表(テーブル)、 またはビューが存在していないということ。 本当にないというのがほとんどであるが、 なぜないのか?ということについて追及する。 Contents1 物理的 …

no image

新発見ORA-01000:最大オープン・カーソル数を超えました。の対処法

意外なことが起因していることがあります。   本日は、 ORA-01000 です。   Javaやcobolの案件でよく ORA-01000:最大オープン・カーソル数を超えました。 …

ORA-01722:数値が無効です「DECODE関数の落とし穴について」

一般的な教科書には DECODE関数の戻り値は 引数と異なるデータ型でも構わない という記載をよく見かけます。   例) SELECT DECODE(result, 2, ‘不合 …