MW211 EXIT

devlog
Oracle/エラーORA-01779
2017年07月30日
「ORA-01779:キー保存されていない表にマップする列は変更できません」の主な原因。

以下だとOK。
┌──────────────────────────────────────┐
│UPDATE (                                                                    │
│        SELECT "表1"."列1",                                                 │
│               "表2"."列2"                                                  │
│            FROM "表1"                                                      │
│                INNER JOIN "表2"                                            │
│                  ON "表2"."主キー" = "表1"."主キー"                        │
│    )                                                                       │
│    SET "列1" = "列2";                                                      │
└──────────────────────────────────────┘

でも、以下だとNG(本エラー)。
┌──────────────────────────────────────┐
│UPDATE (                                                                    │
│        SELECT "表1"."列1",                                                 │
│               "表2"."列2"                                                  │
│            FROM "表1"                                                      │
│                INNER JOIN "表2"                                            │
│                  ON "表2"."非主キー" = "表1"."非主キー"                    │
│    )                                                                       │
│    SET "列1" = "列2";                                                      │
└──────────────────────────────────────┘
入力元(表2)が複数ある場合を恐れて、制限している。
なお、理論上、単数になることを保証できても、許してくれないようだ。


ヒント句「/*+ BYPASS_UJVC */」で回避(強制実行)できた時代もあったようだが
Oracle11g以降は厳しくなってできなくなっている
┌──────────────────────────────────────┐
│UPDATE (                                                                    │
│        SELECT /*+ BYPASS_UJVC */ "表1"."列1",                              │
│                                  "表2"."列2"                               │
│            FROM "表1"                                                      │
│                INNER JOIN "表2"                                            │
│                  ON "表2"."非主キー" = "表1"."非主キー"                    │
│    )                                                                       │
│    SET "列1" = "列2";                                                      │
└──────────────────────────────────────┘
分類:Oracle