MW211 EXIT

devlog
Oracle/EXECUTE IMMEDIATE
2017年08月10日
プレースホルダ的なことができる。
┌──────────────────────────────────────┐
│SQL文 VARCHAR2(256);                                                        │
├──────────────────────────────────────┤
│SQL文 := 'DELETE FROM 表 WHERE キー =:キー';                                │
│EXECUTE IMMEDIATE SQL文 USING 値;                                           │
└──────────────────────────────────────┘
分類:Oracle
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
Oracle/部分一致結合
2017年07月23日
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM "表1"                                                              │
│        INNER JOIN "表2"                                                    │
│          ON  "表2"."列" = "表1"."列"                                       │
└──────────────────────────────────────┘
上記だと完全一致したものしか結合できない。

例えば表1が「ABC」で表2が「ABC2」の場合も結合したい場合、
「'ABC2' LIKE 'ABC%'」的なことをしたい場合、
「CONCAT()」で「%」を結合させてあげれば実現できる。
(「CONCAT()」の代わりに「||」でもOK)
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM "表1"                                                              │
│        INNER JOIN "表2"                                                    │
│          ON  "表2"."列" LIKE CONCAT("表1"."列", '%');                      │
├──────────────────────────────────────┤
│SELECT *                                                                    │
│    FROM "表1"                                                              │
│        INNER JOIN "表2"                                                    │
│          ON  "表2"."列" LIKE "表1"."列" || '%';                            │
└──────────────────────────────────────┘
分類:Oracle
前へ 1 2 次へ