2

Oracle 10gで次のクエリがあります。

UPDATE "SCHEMA1"."CELLS_GLIST" 
SET ("GLIST_VALUE_ID", "USER_ID", "SESSION_ID") = (
    SELECT "GLIST_VALUE_ID", 1 AS "USER_ID", 123456 AS "SESSION_ID"
    FROM "SCHEMA1"."GLISTS_VALUES_UOR"
    WHERE ("UOR_ID"=3)
    AND ("GLIST_ID"=67)
    AND ("GLIST_VALUE_DESC" = (
        SELECT "GLIST_VALUE_DESC"
        FROM "BMAN_TP1"."GLISTS_VALUES_UOR"
        WHERE ("UOR_ID"=3)
        AND ("GLIST_VALUE_ID"="CELLS_GLIST"."GLIST_VALUE_ID")
    ))
)
WHERE EXISTS (......)

ORA-01407: cannot update ("SCHEMA1"."CELLS_GLIST"."SESSION_ID") to NULLと言い続けます

「SESSION_ID」は明らかにNot Nullableですが、実際にはそのフィールドに値を渡しているため、問題がわかりません。

4

2 に答える 2

0

あなたのコメントから、サブクエリがレコードを返さない場合に備えて、デフォルトのレコードをターゲット テーブルに書き込みたいと思われることがわかりました。したがって、クエリを表現する正しい方法は、次のMERGEようなステートメントを使用することです。

MERGE INTO "SCHEMA1"."CELLS_GLIST" dst
USING (
  -- rephrase your subquery here. This is your "merge data source". The number
  -- of records returned in this subquery will correspond to the number of
  -- affected records in dst
) src
ON (
  -- the missing exists condition here. Everytime this condition matches a record
  -- between dst and src, an UPDATE is performed. Otherwise, an INSERT is
  -- performed
)
WHEN MATCHED THEN UPDATE 
  SET dst."GLIST_VALUE_ID" = src."GLIST_VALUE_ID"
WHEN NOT MATCHED THEN INSERT ("GLIST_VALUE_ID", "USER_ID", "SESSION_ID")
  VALUES (NULL, 1, 123456);

これは、アイデアを提供するためのものです。詳細に何を達成しようとしているのかよくわからないので、サブクエリと条件は省略しました

于 2012-07-17T13:39:42.307 に答える
-1

このクエリも機能することがわかりました。

UPDATE "BMAN_TP1"."CELLS_GLIST" 
SET "GLIST_VALUE_ID" = (
    SELECT "GLIST_VALUE_ID"
    FROM "BMAN_TP1"."GLISTS_VALUES_UOR"
    WHERE ("UOR_ID"=3)
    AND ("GLIST_ID"=67)
    AND ("GLIST_VALUE_DESC" = (
        SELECT "GLIST_VALUE_DESC"
        FROM "BMAN_TP1"."GLISTS_VALUES_UOR"
        WHERE ("UOR_ID"=3)
        AND ("GLIST_VALUE_ID"="CELLS_GLIST"."GLIST_VALUE_ID")
        ))
    ),
    "SESSION_ID" = 123456,
    "USER_ID" = 1
WHERE EXISTS (......)

しかし、それは本当に速く実行されます...私は何かが欠けているとは思いません...

于 2012-07-17T14:20:40.320 に答える