2010-02-25 42 views
94

sto ottenendoORA-30926: incapace di ottenere un insieme stabile di righe nelle tabelle di origine

ORA-30926: incapace di ottenere un insieme stabile di righe nelle tabelle di origine

nella seguente query:

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 io ho fatto funzionare la domanda interna (src) che ha anche i dati.

Perché questo errore si verifica e come può essere risolto?

risposta

145

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.

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

Assumendo la query è corretta (non so le tabelle) si potrebbe fare qualcosa di simile:

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'; 
+0

10x Bella risposta. Mi ha aiutato –

+0

anche da me .. proprio sulla testa – TonyP

+1

Questo è probabilmente il motivo per cui altri approcci (per me) hanno anche restituito altri errori per me (come 'procedura, funzione, pacchetto o tipo non è permesso qui' e 'Impossibile modificare un colonna che esegue il mapping a un errore di tabella non conservato con chiave durante il tentativo di inserimento in una vista '). ~ Se aiuta qualcun altro, ho ottenuto lo stesso errore anche dopo aver aggiunto distinti fino a quando non ho riorganizzato i join della mia query interna, così ho iniziato con la tabella che riceveva più di una riga restituita e inner join da lì ... se questo ha un senso. – jinglesthula

33

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.

+0

+1, grazie, mi è appena successo su un tavolo di destinazione con un piccolo numero di duplicati (almeno in base alle chiavi utilizzate nell'unione). – tbone

2

come risolvere ORA-30926 errori? (Doc ID 471956,1)

1) Identificare la dichiarazione in mancanza

alter set sessione di ‘30926 traccia livello nome errorstack 3’ eventi;

o

sistema alter impostato eventi ‘Nome 30926 traccia errorstack off’;

e guardare 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 controllare il piano di esecuzione della query) e analizzare o calcolare le statistiche sulle tabelle interessate se ciò non è stato fatto di recente. Anche gli indici di ricostruzione (o dropping/ricrea) possono essere utili.

3.1) L'istruzione SQL è un MERGE? valuta 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 deterministica dove

3.2) È un'istruzione UPDATE tramite una vista? In tal caso, provare a inserire il risultato della vista in una tabella e provare ad aggiornare direttamente la tabella.

3.3) C'è un trigger 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, soprattutto 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) Verificare ed eliminare eventuali ROW CHAINED o migrati sul tavolo. Ci sono modi per minimizzare questo, come ad esempio l'impostazione corretta di PCTFREE. utilizzo Menzioni 122.020,1 - Row Chaining e migrazione 4.3) Se la tabella è inoltre indice organizzata, vedi: Nota 102.932,1 - Monitoraggio Righe concatenate su IOT

3

avuto l'errore di oggi su un 12c e nessuna delle risposte esistenti fit (nessun duplicato, nessuna espressione non deterministica nella clausola WHERE). Il mio caso è stata legata a quella altra possibile causa di errore, in base al messaggio di testo di Oracle (enfasi sottostante):

ORA-30926: incapace di ottenere un insieme stabile di righe nelle tabelle di origine
Causa: A Non è stato possibile ottenere una serie stabile di righe a causa di un'attività di 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 in azione suggerita del messaggio:

Azione: Rimuovere eventuali clausole di non-deterministici dove e ristampa il DML.

+0

Stavo ricevendo quel messaggio di errore durante l'importazione di DataPump via rete (usando il parametro 'NETWORK_LINK' che si collega direttamente al database sorgente) durante la fase di raccolta delle statistiche, e la nota evidenziata probabilmente lo spiega. Fortunatamente solo le statistiche sono state colpite. –