External Table - Filtrare record

di il
1 risposte

External Table - Filtrare record

Ciao a tutti,
ho creato una External Table che legge da un file con separatore ";". Ho necessità di scartare alcuni record che non dovrebbero essere letti dalla ET.

Sto utilizzando un file di esempio che ha 2 colonne:
  • Nome
  • Cognome
Attualmente ho impostato lo script in modo da scartare, con l'opazione REJECT ROWS WITH ALL NULL FIELDS, i record con entrambi i campi null:
CREATE TABLE "PROVA_ET" (
  "NOME" VARCHAR2(255), 
  "COGNOME" VARCHAR2(255), 
  ) 
   ORGANIZATION EXTERNAL 
    ( TYPE ORACLE_LOADER
      DEFAULT DIRECTORY "DIR_PROVA"
      ACCESS PARAMETERS ( 
        RECORDS DELIMITED BY NEWLINE
        BADFILE DIR_PROVA: 'prova_et.bad'
        DISCARDFILE DIR_PROVA: 'prova_et.dis'
        LOGFILE DIR_PROVA: 'prova_et.log'
        SKIP 1
        fields terminated by ";"
        MISSING FIELD VALUES ARE NULL
        REJECT ROWS WITH ALL NULL FIELDS (
          NOME CHAR(255),
          COGNOME CHAR(255)
        )
      )
      LOCATION ( 
        "INPUT_DIR_PROVA":'prova.csv'
      )
    )
  REJECT LIMIT UNLIMITED
;
 
Come anticipato, ho necessità di scartare tutti i record che hanno il campo COGNOME valorizzato, per esempio, con 'Rossi'.
Leggendo in internet ho trovato una soluzione che è quella di impostare, nell'opzione REJECT ROWS WITH ALL NULL FIELDS, un NULLIF COGNOME = 'Rossi' su tutti i campi
CREATE TABLE "PROVA_ET" (
  "NOME" VARCHAR2(255), 
  "COGNOME" VARCHAR2(255), 
  ) 
   ORGANIZATION EXTERNAL 
    ( TYPE ORACLE_LOADER
      DEFAULT DIRECTORY "DIR_PROVA"
      ACCESS PARAMETERS ( 
        RECORDS DELIMITED BY NEWLINE
        BADFILE DIR_PROVA: 'prova_et.bad'
        DISCARDFILE DIR_PROVA: 'prova_et.dis'
        LOGFILE DIR_PROVA: 'prova_et.log'
        SKIP 1
        fields terminated by ";"
        MISSING FIELD VALUES ARE NULL
        REJECT ROWS WITH ALL NULL FIELDS (
          NOME CHAR(255) NULLIF COGNOME='Rossi',
          COGNOME CHAR(255) NULLIF COGNOME='Rossi'
        )
      )
      LOCATION ( 
        "INPUT_DIR_PROVA":'prova.csv'
      )
    )
  REJECT LIMIT UNLIMITED
;
 
È l'unica soluzione possibile oppure potete consigliarmene un'altra?

Grazie in anticipo, ciao.

Michele

1 Risposte

  • Re: External Table - Filtrare record

    Stavo effettuando delle prove ed ho riscontrato che la soluzione non funziona sui campi successivi a quello inserito nella condizione.
    Aggiungo la colonna RESIDENZA all'esempio precedente e lo script diventa:
    CREATE TABLE "PROVA_ET" (
      "NOME" VARCHAR2(255), 
      "COGNOME" VARCHAR2(255), 
      "RESIDENZA" VARCHAR2(255)
      ) 
       ORGANIZATION EXTERNAL 
        ( TYPE ORACLE_LOADER
          DEFAULT DIRECTORY "DIR_PROVA"
          ACCESS PARAMETERS ( 
            RECORDS DELIMITED BY NEWLINE
            BADFILE DIR_PROVA: 'prova_et.bad'
            DISCARDFILE DIR_PROVA: 'prova_et.dis'
            LOGFILE DIR_PROVA: 'prova_et.log'
            SKIP 1
            fields terminated by ";"
            MISSING FIELD VALUES ARE NULL
            REJECT ROWS WITH ALL NULL FIELDS (
              NOME CHAR(255) NULLIF COGNOME='Rossi',
              COGNOME CHAR(255) NULLIF COGNOME='Rossi',
              RESIDENZA CHAR(255) NULLIF COGNOME='Rossi'
            )
          )
          LOCATION ( 
            "INPUT_DIR_PROVA":'prova.csv'
          )
        )
      REJECT LIMIT UNLIMITED
    ;
     
    Considerando che il file sorgente è così valorizzato
    • NOME;COGNOME;RESIDENZA
    • MARIO;ROSSI;MILANO

    effettuando una select sulla ET il risultato sarebbe:
    • NULL;NULL;MILANO
    Sembra che non riesca a settare a NULL il campo RESIDENZA in quanto successivo a COGNOME e quindi il record, non essendo nulli tutti i campi (caratteristica essenziale per me), viene comunque selezionato.

    Come posso ovviare a questo problema?

    Grazie ancora
Devi accedere o registrarti per scrivere nel forum
1 risposte