Jeg får
ORA-30926: ikke i stand til å få et stabilt sett med rader i kildetabellene
i følgende spørring:
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';
Jeg har kjørt table_1
, den har data, og jeg har også kjørt den innvendige spørringen (src
) som også har data.
Hvorfor kommer denne feilen, og hvordan kan den løses?
Dette skyldes vanligvis duplikater i spørringen spesifisert i USING-klausulen. Dette betyr sannsynligvis at TABLE_A er en overordnet tabell og at samme ROWID returneres flere ganger.
Du kan raskt løse problemet ved å bruke en DISTINCT i spørringen din (faktisk, hvis 'Y' er en konstant verdi, trenger du ikke engang å sette den i spørringen).
Forutsatt at spørringen din er riktig (kjenner ikke tabellene dine), kan du gjøre noe sånt som dette:
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';
Du prøver sannsynligvis å oppdatere den samme raden i måltabellen flere ganger. Jeg har nettopp støtt på det samme problemet i en sammenslåingsoppgave jeg utviklet. Forsikre deg om at oppdateringen din ikke berører den samme posten mer enn én gang i utførelsen av sammenslåingen.
Hvordan feilsøke ORA-30926-feil? (Dok ID 471956.1)
endre sesjonsinnstilte hendelser '30926 sporingsnavn feilstabel nivå 3';
eller
alter system set events '30926 trace name errorstack off';
og se etter .trc-filer i UDUMP når det oppstår.
3.1) Er SQL-setningen en MERGE? evaluer dataene som returneres av USING-klausulen for å sikre at det ikke finnes dupliserte verdier i sammenføyningen. Endre merge-setningen for å inkludere en deterministisk where-klausul.
3.2) Er dette en UPDATE-setning via en visning? I så fall kan du prøve å fylle inn visningsresultatet i en tabell og prøve å oppdatere tabellen direkte.
3.3) Er det en utløser i tabellen? Prøv å deaktivere den for å se om den fortsatt feiler.
3.4) Inneholder utsagnet en ikke-sammenslåbar visning i en 'IN-Subquery'? Dette kan føre til at dupliserte rader returneres hvis spørringen har en "FOR UPDATE"-klausul. Se feil 2681037
3.5) Har tabellen ubrukte kolonner? Hvis disse slettes, kan feilen unngås.