甲骨文“无法更新为NULL”(Oracle “Cannot update to NULL”)

2019-09-19 15:04发布

我有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:不能更新为NULL( “SCHEMA1” “CELLS_GLIST” “SESSION_ID”。)

“SESSION_ID”显然是不能为空 ,但实际上,我传递一个值到该字段,所以我不明白的问题。

Answer 1:

从您的意见,我看你似乎想要写一个默认记录到目标表,如果子查询不返回任何记录。 所以,正确地表达出你的查询是用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);

这只是给你一个想法。 我不太清楚你想详细实现什么,所以我省略了子查询和条件



Answer 2:

我发现这个查询还工作:

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 (......)

但是,它执行真的太快了,我怀疑我失去了一些东西...



文章来源: Oracle “Cannot update to NULL”