ORA-30926: imansible ottenere un set stabile di righe nelle tabelle di origine

Sto arrivando

ORA-30926: imansible ottenere un set stabile di righe nelle tabelle di origine

nella seguente domanda:

MERGE INTO table_1 a USING (SELECT a.ROWID row_id, 'Y' FROM table_1 a ,table_2 b ,table_3 c WHERE a.mbr = c.mbr AND b.head = c.head AND b.type_of_action  '6') src ON ( a.ROWID = src.row_id ) WHEN MATCHED THEN UPDATE SET in_correct = 'Y'; 

Ho eseguito table_1 ha dati e anche ho eseguito la query interna ( src ) che ha anche dati.

Perché dovrebbe venire questo errore e come può essere risolto?

    Questo di solito è causato da duplicati nella query specificata nella clausola USING. Questo probabilmente significa che TABLE_A è una tabella padre e lo stesso ROWID viene restituito più volte.

    È ansible risolvere rapidamente il problema utilizzando un DISTINCT nella query (infatti, se ‘Y’ è un valore costante non è nemmeno necessario inserirlo nella query).

    Supponendo che la tua query sia corretta (non conosci le tue tabelle) potresti fare qualcosa del genere:

      MERGE INTO table_1 a USING (SELECT distinct ta.ROWID row_id FROM table_1 a ,table_2 b ,table_3 c WHERE a.mbr = c.mbr AND b.head = c.head AND b.type_of_action <> '6') src ON ( a.ROWID = src.row_id ) WHEN MATCHED THEN UPDATE SET in_correct = 'Y'; 

    Probabilmente stai tentando di aggiornare più volte la stessa riga della tabella di destinazione. Ho appena incontrato lo stesso problema in una dichiarazione di fusione che ho sviluppato. Assicurati che il tuo aggiornamento non tocchi lo stesso record più di una volta nell’esecuzione dell’unione.

    Come risolvere gli errori ORA-30926? (ID documento 471956.1)

    1) Identifica la dichiarazione fallita

    alterare gli eventi del set di sessione ‘30926 nome traccia errorstack livello 3’;

    o

    alterare gli eventi del set di sistema ‘30926 trace name errorstack off’;

    e guarda i file .trc in UDUMP quando si verifica.

    2) Dopo aver trovato l’istruzione SQL, controllare se è corretta (magari usando spiegare piano o tkprof per verificare il piano di esecuzione della query) e analizzare o calcolare le statistiche sulle tabelle interessate se questo non è stato fatto di recente. Anche gli indici di ricostruzione (o dropping / ricrea) possono essere utili.

    3.1) L’istruzione SQL è UN MERGE? valutare i dati restituiti dalla clausola USING per garantire che non vi siano valori duplicati nel join. Modificare la dichiarazione di unione per includere una clausola where deterministica

    3.2) Si tratta di un’istruzione UPDATE tramite una vista? In tal caso, prova a inserire il risultato della vista in una tabella e prova ad aggiornare direttamente la tabella.

    3.3) C’è un grilletto sul tavolo? Prova a disabilitarlo per vedere se fallisce ancora.

    3.4) La dichiarazione contiene una vista non cumulabile in una ‘sotto-sottoquery’? Ciò può comportare il ritorno di righe duplicate se la query ha una clausola “FOR UPDATE”. Vedi Bug 2681037

    3.5) La tabella contiene colonne non utilizzate? Eliminarli potrebbe impedire l’errore.

    4) Se la modifica di SQL non risolve l’errore, il problema potrebbe riguardare la tabella, specialmente se ci sono righe concatenate. 4.1) Eseguire l’istruzione ‘ANALYZE TABLE VALIDATE STRUCTURE CASCADE’ su tutte le tabelle utilizzate nell’SQL per vedere se ci sono corruzioni nella tabella o nei suoi indici. 4.2) Controlla ed elimina eventuali ROW CHAINED o migrati sul tavolo. Ci sono modi per minimizzare questo, come ad esempio l’impostazione corretta di PCTFREE. Utilizzare la nota 122020.1 – Concatenamento di righe e migrazione 4.3) Se la tabella è inoltre Index organizzato, vedere: Nota 102932.1 – Monitoraggio di righe concatenate su IOT

    Aveva l’errore di oggi su un 12c e nessuna delle risposte esistenti si adattava (nessun duplicato, nessuna espressione non deterministica nella clausola WHERE). Il mio caso era correlato a quell’altra ansible causa dell’errore, secondo il testo del messaggio di Oracle (enfasi in basso):

    ORA-30926: imansible ottenere un set stabile di righe nelle tabelle di origine
    Causa: non è stato ansible ottenere un set stabile di righe a causa di un’attività dml di grandi dimensioni o di una clausola where non deterministica.

    L’unione faceva parte di un batch più grande ed è stata eseguita su un database attivo con molti utenti simultanei. Non è stato necessario modificare la dichiarazione. Ho appena eseguito la transazione prima dell’unione, quindi ho eseguito l’unione separatamente e ho eseguito nuovamente il commit. Quindi la soluzione è stata trovata nell’azione suggerita del messaggio:

    Azione: rimuovere le eventuali clausole non deterministiche e riemettere il dml .

     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. 

    Questo errore si è verificato per me a causa di record duplicati (16 KB)

    Ho provato con un lavoro unico .

    ma ancora una volta quando ho provato l’unione senza uno stesso identico problema si è verificato la seconda volta era dovuto al commit

    dopo l’unione se il commit non viene eseguito, verrà visualizzato l’errore.

    Senza univoco, Query funzionerà se viene eseguito il commit dopo ogni operazione di unione.