Oracle external table (met utf-8 coded file)

on

Om snel een csv bestand te koppelen een Oracle database, gebruik ik external tables. Hier een quick note hoe dit aan te maken:

Bepaal op de server een directory waar de te koppelen bestanden terecht gaan komen. In mijn geval is dat /var/oracle/import01. Zorg dat deze dir voldoende lees/schrijf rechten heeft. Alles wordt uitgevoerd als oracle:dba op mijn systeem. (OpenSuse 11.3 met Oracle 10XE).

Log nu in als iemand die rechten heeft om Oracle directory’s aan te mogen maken. En maak de directory en grant deze aan diegene die het schrijven en lezen gaat uitvoeren (knilluz in mijn geval dus).

create or replace directory import01 as '/var/oracle/import01';
grant read, write on directory import01 to knilluz;

Plaats nu het bestand in de dir (/var/oracle/import01/ext_tab_test.txt in mijn geval).
En creëer de tabel:

create table ext_table_test
( voornaam       varchar2(255)
, achternaam     varchar2(255)
, voorvoegsels   varchar2(255)
, geboortedatum  varchar2(255)
, straat         varchar2(255)
, huisnummer     varchar2(255)
, postcode       varchar2(255)
, plaats         varchar2(255)
)
organization external
( default directory import01
access parameters
 ( records delimited by newline
 characterset 'UTF8'
 fields terminated by ';'
 missing field values are null
 )
 location ('ext_tab_test.txt')
 );

Let er goed op dat de layout van het bestand de volgorde heeft van de volgorde van de kolommen in het create table gedeelte. Omdat ik lui ben neem ik voor het creeeren van de velden ‘onzinnig’ grote datatypes allen van varchar2(255). In het verwerkingsproces ga ik hier wel string functies op los laten. Omdat het bestand in UTF8 is gecodeerd, heb ik dit als characterset clausule opgenomen. Omdat anders lettertekens malle dingen gaan doen met namen als Nedžija, Henriëtte of José

Zo zit in dit bestand alleen maar de voornamen van de personen. En daar zitten juwelen tussen Hermina Dirkina Maria Barbara Geertruida Bernardina  bijvoorbeeld. Hier wil ik echter alleen voorletters van hebben (H.D.M.B.G.B.). Daar had ik het volgende stukje sql voor geschreven (met uitleg, want :

— voorletters van voornamen maken (voorletters is van datatype varchar2(10))
— 1. vervang alle niet hoofdletters door ‘niks’ [REGEXP_REPLACE(voornamen,'([^A-Z])’,”)] (Hermina Dirkina Maria Barbara Geertruida Bernardina wordt dan (HDMBGB)
— 2. neem alleen de eerste 5 voorletters [substr(‘[result stap 1]’,1,5)] (HDMBGB wordt dan HDMBG)
— 3. vervang iedere occurrence van de huidige string (.) door zichzelf met een puntje erachter [REGEXP_REPLACE(‘result stap 2′,'(.)’,’\1.’)]. (HDMBG wordt nu H.D.M.B.G.

REGEXP_REPLACE(SUBSTR(REGEXP_REPLACE(voornamen,'([^A-Z])',''),1,5),'(.)','\1.') voorletters

Oh en nog een laatste vingeroefeningetje. Zoek alle voornamen waar malle tekens in voorkomen (dus sluit die namen uit waar alleen maar a-z’en,  A-Z’en en spaties in voorkomen.

SELECT * FROM table WHERE REGEXP_LIKE(voornamen,'[^a-z,A-Z, ]')