Joko tunnet nämän Oracle10g SQL:n piirteet? Kari Aalto Saariston IT
Agenda Regular Expression - funktiot Case-insensitive Sort Case-insensitive Seach Merge muutokset Tree-walking in 10g DML Returning Values Login ja glogin.sql Sample & Seed 2
Regular Expression -funktiot Regular expression -toiminnallisuus mahdollistaa merkkimuotoisen tiedon haun ja käsittelyn k erää äänlaisten mallien (pattern) avulla REGEXP_LIKE REGEXP_INSTR REGEXP_REPLACE REGEXP_SUBSTR tiedonhaku mallin (pattern) perusteella hakee merkkijonosta mallia ja palauttaa sen alkuposition hakee merkkijonosta mallia ja korvaa sen toisella merkkijonolla hakee merkkijonosta mallia ja palauttaa osajonon 3
REGEXP_LIKE muistuttaa LIKE-operaattoria, mutta tarjoaa enemmän n mahdollisuuksia syntaksi: REGEXP_LIKE (SearchString, PatternToMatch, MatchParam) 4
REGEXP_LIKE etsitää ään n tuotteita, joiden nimissä esiintyy x (i = case insensitive matching) SELECT tuote_id, nimi FROM tuotteet WHERE REGEXP_LIKE (nimi, 'x', 'i'); etsitää ään n tuotteita, joiden nimissä esiintyy joko laturi tai startti sana SELECT tuote_id, nimi FROM tuotteet WHERE REGEXP_LIKE (nimi, 'laturi startti', 'i'); 5
REGEXP_LIKE etsitää ään n tuotteita, joiden nimien alussa esiintyy joko laturi- tai startti-sana sana SELECT tuote_id, nimi FROM tuotteet WHERE REGEXP_LIKE (nimi, '^laturi ^startti', 'i'); etsitää ään n tuotteita, joiden nimissä esiintyy joko s tai c SELECT tuote_id, nimi FROM tuotteet WHERE REGEXP_LIKE (nimi, '[s c]', 'i'); 6
Case-insensitive Sort asettamalla NLS_SORT parametrin arvoksi 'binary_ci' saadaan aikaan lajittelu, joka ei tee eroa isojen ja pienten kirjainten välillv lillä SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_SORT'; PARAMETER NLS_SORT VALUE BINARY ALTER SESSION SET nls_sort=binary_ci; 7
Case-insensitive Search asettamalla NLS_SORT parametrin arvoksi 'binary_ci' ja NLS_COMP parametrin arvoksi 'ansi' saadaan hakutoiminnallisuus, joka ei tee eroa isojen ja pienten kirjainten välillv lillä ALTER SESSION SET nls_sort=binary_ci nls_comp=ansi; toimii operaattoreilla =, <>,!=, <, >, <=, >= IN, BETWEEN, CASE ORDER BY, START WITH, HAVING 8
Merge-käsky on Select-,, Insert- ja Update- ja Delete-käskyjen yhdistelmä uutuutena Oracle9i:ssä tuntee myös s nimen Upsert tarkoituksena virkistää kohdetaulua Select-lauseen lauseen palauttamalla tiedolla käyttökelpoinen esim. Data Warehousejärjestelmissä (tietojen siirto/refresh lähdel hdejärjestelmistä tietovarastoon) 9
idea: Merge-käsky jos avaimenarvoa vastaavaa riviä ei kohdetaulussa ole, tehdää ään n lisäys muussa tapauksessa päivitys p...... tai poisto uutuutena Oracle10g:ssä Merge:llä voidaan poistaa rivejä kohdetaulusta Oracle10g:ssä voidaan asettaa ehtoja lisäykselle, päivitykselle ja poistolle 10
Esimerkki Merge:n käytk ytöstä MERGE /*+APPEND*/ INTO asiakkaat_dw a_dw USING ( SELECT id, nimi, lahios, kaupunki FROM asiakkaat) a ON (a_dw.id = a.id) WHEN MATCHED THEN UPDATE SET a_dw.lahios = a.lahios, a_dw.kaupunki = a.kaupunki WHERE a.lahios IS NOT NULL DELETE WHERE a_dw.kaupunki = 'Baghdad' WHEN NOT MATCHED THEN INSERT ( a_dw.id, a_dw.nimi, a_dw.lahios, a_dw.kaupunki) VALUES (a.id, a.nimi, a.lahios, a.kaupunki) WHERE a.id BETWEEN 1000 AND 2000; 11
TREE-WALKING in 10g CONNECT BY PRIOR START WITH ORDER SIBLINGS BY CONNECT_BY_ROOT määrittelee hierarkian tasojen välisen yhteyden osoittaa hierarkian läpikl pikäynnin alkukohdan määrittelee samalla tasolla olevien rivien lajittelujärjestyksen mahdollistaa viittauksen root-rivin rivin sarakkeisiin 12
TREE-WALKING in 10g CONNECT_BY_ISCYCLE CONNECT_BY_ISLEAF LEVEL SYS_CONNECT_BY_PATH paljastaa luupin hierarkiassa (arvot 0 tai 1) kertoo, onko kyseessä lehti taso taso (alin taso) rivin suhteellinen taso hierarkiassa palauttaa sarakkeen arvon ketjun root-rivist rivistä aktiiviselle riville saakka 13
TREE-WALKING in 10g luetaan työntekij ntekijätietoja tietoja ja lajitellaan sisarukset sukunimen mukaan SELECT LPAD(' ', 2*LEVEL) id AS id, etunimi, sukunimi, pomo_id FROM tyontekijat START WITH pomo_id is null CONNECT BY PRIOR id = pomo_id ORDER SIBLINGS BY sukunimi; 14
TREE-WALKING in 10g tulostetaan myös suuren johtajan nimi (Connect_by_root) ja sukunimien muodostama ketju tästä johtajasta aktiiviselle riville SELECT LPAD(' ', 2*LEVEL) id AS id, etunimi, sukunimi, pomo_id, CONNECT_BY_ROOT sukunimi AS isopomo, SYS_CONNECT_BY_PATH(sukunimi, ' ') AS ketju FROM tyontekijat START WITH pomo_id is null CONNECT BY PRIOR id = pomo_id ORDER SIBLINGS BY sukunimi; 15
9i: DML-käskyt ja palautuvat arvot DECLARE apu1 asiakkaat.nimi%type; apu2 asiakkaat.kaupunki%type; apu3 asiakkaat.maa%type; BEGIN UPDATE asiakkaat SET nimi ='SAARELA', kaupunki = 'RAUMA', maa = 'SUOMI' WHERE id = 10 RETURNING substr(nimi, 1,3), kaupunki, substr(maa, 1, 1) INTO apu1, apu2, apu3; END; / 16
10g: INSERT ja palautuvat arvot Insert-käsky sky voi palauttaa yksittäisen isen funktion arvon funktion arvo johdetaan niistä riveistä,, joihin Insertkäsky kohdistuu DECLARE duunari_lkm number(4);... BEGIN INSERT INTO duunarit SELECT * FROM tyontekijat RETURNING count(id) INTO duunari_lkm; END; / 17
10g: UPDATE ja palautuvat arvot annetaan normaali palkankorotus ja katsotaan samalla, miten kalliiksi se tulee DECLARE palkka_summa number(9,2);... BEGIN UPDATE tyontekijat SET palkka = palkka * 1.5 RETURNING sum(palkka) INTO palkka_summa; END; / 18
Muuta uutta... DEFAULT-avainsanaa voidaan käyttk yttää INSERT-ja UPDATE-käskyjen yhteydessä UPDATE asiakkaat SET luottoluokitus = DEFAULT WHERE kirjpvm = '01.05.2006'; SELECT... FOR UPDATE käskylle voidaan antaa odotusajan pituus (ennen WAIT/NOWAIT) SELECT * FROM asiakkaat WHERE kaupunki = 'TAMPERE' FOR UPDATE WAIT 4; 19
SQL*PLUS-muutoksia login.sql ja glogin.sql tiedostot suoritetaan automaattisesti sqlplussan käynnistyksen k yhteydessä 10g:ssä ne suoritetaan myös s connect-käskyn yhteydessä poistetut objektit säilyvs ilyvät t roskakorissa, kunnes annetaan Purge-käsky (jos kanta on flashback- moodissa) tai SHOW RECYCLE BIN PURGE TABLE x INDEX x TABLESPACE x RECYCLEBIN; FLASHBACK TABLE x TO BEFORE DROP; 20
SAMPLE ja SEED jo aiemmin Oraclessa on voinut hakea satunnaisen otoksen sample-optiolla SELECT * FROM myynnit WHERE kaupunki = 'PORI' SAMPLE(10); -- noin 10 prosenttia Seed-optio varmistaa, että satunnaisen otoksen rivit ovat samat kun haku toistetaan SELECT * FROM myynnit WHERE kaupunki = 'PORI' SAMPLE(10) SEED(1); -- samat noin 10 prosenttia 21
Hyvää kevää ään n jatkoa! Kari Aalto kari.aalto@saaristonit.fi