sql >> Database teknologi >  >> RDS >> Oracle

Oracle-datokorruption under opdatering

OPDATERING:

Jeg kan ikke finde nogen publiceret reference til denne specifikke type DATE-korruption på Oracles supportwebsted. (Det kan være der, mine hurtige søgninger viste det bare ikke.)

  • Baddate-script til at kontrollere databasen for korrupte datoer [ID 95402.1]
  • Bug 2790435 - Seriel INSERT med parallel SELECT og typekonvertering kan indsætte korrupte data [ID 2790435.8]

Outputtet fra funktionen DUMP() viser, at datoværdien faktisk er ugyldig:

Typ=12 Len=7: 120,110,11,18,13,0,16 

Vi forventer, at minutbyten skal være en værdi mellem en og tres, ikke nul.

De 7 bytes af en DATO-værdi repræsenterer i rækkefølge århundrede(+100), år(+100), måned, dag, time(+1), minutter(+1), sekunder(+1).

Den eneste gang, jeg har set ugyldige DATE-værdier som denne, når en DATE-værdi blev leveret som en bindingsvariabel, fra et Pro*C-program (hvor bindingsværdien leveres i den interne 7 byte-repræsentation, helt uden om de normale valideringsrutiner, der fange ugyldige datoer, f.eks. 30. februar)

Der er ingen grund til at forvente den adfærd, du ser, i betragtning af den Oracle-syntaks, du har sendt.

Dette er enten en falsk anomali (hukommelseskorruption?), eller hvis dette kan gentages, så er det en fejl (fejl) i Oracle-koden. Hvis det er en fejl i Oracle-koden, vil de mest sandsynlige mistænkte være "nye" funktioner i en ikke-patchet udgivelse.

(Jeg ved, at CAST er en standard SQL-funktion, der har eksisteret i evigheder i andre databaser. Jeg tror, ​​jeg er gammeldags, og jeg har aldrig introduceret det i mit Oracle-syntaksrepertoire. Jeg ved ikke, hvilken version af Oracle det var, der introducerede CAST, men jeg ville have holdt mig væk fra den i den første udgivelse, den dukkede op i.)

Det store "røde flag" (som en anden kommentator bemærkede) er, at CAST( datecol AS DATE) .

Du ville forvente, at optimeringsværktøjet behandler det som svarende til date_col ... men tidligere erfaringer viser os, at TO_NUMBER( number_col ) tolkes faktisk af optimeringsværktøjet som TO_NUMBER( TO_CHAR ( number_col ) ) .

Jeg formoder, at noget lignende kan være i gang med den unødvendige CAST.

Baseret på den ene registrering, du viste, formoder jeg, at problemet er med værdier med en "59"-værdi i minutter eller sekunder, og muligvis en "23"-værdi for timer, ville være dem, der viser fejlen.

Jeg ville prøve at se efter steder, hvor minutter, time eller sekunder er gemt som 0:

SELECT id, DUMP(activitydate)
  FROM newtable
 WHERE DUMP(activitydate) LIKE '%,0,%' 
    OR DUMP(activitydate) LIKE '%,0'


  1. Node.js og mysql tilbagekald :forespørgsel i forespørgsel tilbagekald

  2. Kan nogen hjælpe mig med at finde ud af betydningen af ​​denne php-fejlmeddelelse?

  3. doktrin 2 - Hvordan forbedrer man skylleeffektiviteten?

  4. Sqlalchemy.exc.OperationalError:(psycopg2.OperationalError)