unir unable the tables tablas stable source remove relacionadas reissue podido origen ora obtener non las juego filas estable ejemplo consultar consulta clauses and sql oracle merge

sql - unable - remove any non deterministic where clauses and reissue the dml



ORA-30926: no se puede obtener un conjunto estable de filas en las tablas fuente al combinar tablas (2)

Tengo esta declaración de fusión:

MERGE INTO TB_DP_REGIAO B USING TMP_DP_REGIAO P ON (P.DS_PROTHEUS_CODE = B.DS_PROTHEUS_CODE) WHEN MATCHED THEN UPDATE SET B.DS_PLANNING_CODE = CASE WHEN B.DT_LOAD < P.DT_LOAD THEN P.DS_PLANNING_CODE ELSE B.DS_PLANNING_CODE END, B.DT_LOAD = CASE WHEN B.DT_LOAD < P.DT_LOAD THEN P.DT_LOAD ELSE B.DT_LOAD END WHEN NOT MATCHED THEN INSERT(B.DS_PROTHEUS_CODE, B.DS_PLANNING_CODE, B.DT_LOAD) VALUES(P.DS_PROTHEUS_CODE, P.DS_PLANNING_CODE, P.DT_LOAD);

Eso me está devolviendo este error:

Error starting at line 1 in command: MERGE INTO TB_DP_REGIAO B USING TMP_DP_REGIAO P ON (P.DS_PROTHEUS_CODE = B.DS_PROTHEUS_CODE) WHEN MATCHED THEN UPDATE SET B.DS_PLANNING_CODE = CASE WHEN B.DT_LOAD < P.DT_LOAD THEN P.DS_PLANNING_CODE ELSE B.DS_PLANNING_CODE END, B.DT_LOAD = CASE WHEN B.DT_LOAD < P.DT_LOAD THEN P.DT_LOAD ELSE B.DT_LOAD END WHEN NOT MATCHED THEN INSERT(B.DS_PROTHEUS_CODE, B.DS_PLANNING_CODE, B.DT_LOAD) VALUES(P.DS_PROTHEUS_CODE, P.DS_PLANNING_CODE, P.DT_LOAD) Error report: 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.

Cuando la tabla objetivo está vacía, funciona. Si lo ejecuto cuando el P.DT_LOAD es el mismo que B.DT_LOAD , funciona. Cuando lo ejecuto al día siguiente, cuando el P.DT_LOAD está un día por delante, aparece este error.

¿Alguien me puede ayudar en esto?

¡Gracias por adelantado!


Es un caso un poco complicado. La razón principal es que parece tener duplicados en la columna TMP_DP_REGIAO.DS_PROTHEUS_CODE y MERGE intenta actualizar la misma fila de la tabla de destino varias veces. Pero si los nuevos valores y los valores antiguos en las columnas actualizadas son los mismos, Oracle puede omitir este problema de duplicados:

SQL> select * from t; CODE TEXT ---------- ---------- 1 test SQL> merge into t using ( 2 select 1 code,''test'' text from dual union all 3 select 1 code,''test'' text from dual 4 ) s 5 on (t.code = s.code) 6 when matched then 7 update set t.text = s.text 8 / 2 rows merged

Pero si los valores antiguos y nuevos son diferentes, Oracle plantea la excepción que obtienes:

SQL> merge into t using ( 2 select 1 code,''a'' text from dual union all 3 select 1 code,''a'' text from dual 4 ) s 5 on (t.code = s.code) 6 when matched then 7 update set t.text = s.text 8 / merge into t using ( * error in line 1: ORA-30926: unable to get a stable set of rows in the source tables


Otra razón de este problema podría ser las condiciones especificadas en la cláusula ON. Este error se produce cuando hay una asignación de 1 a muchos a sus filas de destino frente a las filas de origen, respectivamente, que puede deberse a dos razones.

1) there are duplicate rows in source table. 2) there are unique rows in source table, but ON clause conditions are pointing to multiple rows in the source table.

En el segundo caso, las condiciones de la cláusula ON tienen que modificarse para lograr el mapeo de 1 a 1 o de muchos a uno en el destino y la tabla fuente, respectivamente.