As part of a bug fix for an ERP system I'm maintaining (Cleva), I need to mass update the SOR_CODE_PRODUCT2
field of the F_SIT_OBJET_RISQUE
table with the PRI_REF_RISQUE
field from the F_PRD_RISQUE
table.
These two tables are linked together in correspondence with the following (simplified) data model:
I expected the following MERGE
statement to work :
MERGE INTO F_SIT_OBJET_RISQUE
USING (
SELECT
sor.SOR_IDENT,
pri2.PRI_REF_RISQUE
FROM F_SIT_OBJET_RISQUE sor
JOIN F_PRD_RISQUE pri
ON sor.SOR_REFOBJF = pri.PRI_REF_RISQUE
JOIN F_PRD_RISQUE pri2
ON pri.PRI_REF_RISQUE_C = pri2.PRI_REF_RISQUE
WHERE pri2.PRI_REF_RISQUE IS NOT NULL
) SOURCEDATA ON (SOURCEDATA.SOR_IDENT = F_SIT_OBJET_RISQUE.SOR_IDENT)
WHEN MATCHED THEN UPDATE
SET F_SIT_OBJET_RISQUE.SOR_CODE_PRODUCT2 = SOURCEDATA.PRI_REF_RISQUE
It doesn't. It produces the following error:
SQL Error: ORA-30926: unable to get a stable set of rows in the source tables
30926. 00000 - "unable to get a stable set of rows in the source tables"
*Cause: A stable set of rows could not be got because of large dml
activity or a non-deterministic where clause.
*Action: Remove any non-deterministic where clauses and reissue the dml.
The following MERGE
statement, and many other variations I tried, all produce the same error :
MERGE INTO F_SIT_OBJET_RISQUE
USING (
SELECT
pas.PAS_IDENT,
pol.POL_IDENT,
sor.SOR_IDENT,
pri.PRI_IDENT,
pri2.PRI_IDENT "PRI_IDENT_2",
pri2.PRI_REF_RISQUE
FROM F_PRODUITASS pas
JOIN F_POLICES pol
ON pas.PAS_IDENT = pol.POL_PTRPASID
JOIN F_SIT_OBJET_RISQUE sor
ON pol.POL_IDENT = sor.SOR_PTRPOLID
JOIN F_PRD_RISQUE pri
ON sor.SOR_REFOBJF = pri.PRI_REF_RISQUE
AND sor.SOR_TABLE = pri.PRI_TYPE_RISQUE
AND pas.PAS_IDENT = pri.PRI_PTRPASIDENT
JOIN F_PRD_RISQUE pri2
ON pri.PRI_REF_RISQUE_C = pri2.PRI_REF_RISQUE
WHERE pri2.PRI_REF_RISQUE IS NOT NULL
) SOURCEDATA ON (SOURCEDATA.SOR_IDENT = F_SIT_OBJET_RISQUE.SOR_IDENT)
WHEN MATCHED THEN UPDATE
SET F_SIT_OBJET_RISQUE.SOR_CODE_PRODUCT2 = SOURCEDATA.PRI_REF_RISQUE
Interestingly, the latter MERGE
statement does work when I add the restriction AND pol.POL_NUMPOL = '5H00314'
to my WHERE
clause:
MERGE INTO F_SIT_OBJET_RISQUE
USING (
SELECT
pas.PAS_IDENT,
pol.POL_IDENT,
sor.SOR_IDENT,
pri.PRI_IDENT,
pri2.PRI_IDENT "PRI_IDENT_2",
pri2.PRI_REF_RISQUE
FROM F_PRODUITASS pas
JOIN F_POLICES pol
ON pas.PAS_IDENT = pol.POL_PTRPASID
JOIN F_SIT_OBJET_RISQUE sor
ON pol.POL_IDENT = sor.SOR_PTRPOLID
JOIN F_PRD_RISQUE pri
ON sor.SOR_REFOBJF = pri.PRI_REF_RISQUE
AND sor.SOR_TABLE = pri.PRI_TYPE_RISQUE
AND pas.PAS_IDENT = pri.PRI_PTRPASIDENT
JOIN F_PRD_RISQUE pri2
ON pri.PRI_REF_RISQUE_C = pri2.PRI_REF_RISQUE
WHERE pri2.PRI_REF_RISQUE IS NOT NULL
AND pol.POL_NUMPOL = '5H00314'
) SOURCEDATA ON (SOURCEDATA.SOR_IDENT = F_SIT_OBJET_RISQUE.SOR_IDENT)
WHEN MATCHED THEN UPDATE
SET F_SIT_OBJET_RISQUE.SOR_CODE_PRODUCT2 = SOURCEDATA.PRI_REF_RISQUE
Then, it does update the correct field with the correct value, and produces the following output :
3 rows merged.
For my mass update, I cannot use this restriction, however. The update needs to take place no matter what's the value of pol.POL_NUMPOL
.
Any suggestions?