Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

XML-funksjoner i MySQL

749 vues

Publié le

Foredrag om XML-funksjonalitet i databasesystemet MySQL 5.1

Publié dans : Technologie
  • Soyez le premier à commenter

XML-funksjoner i MySQL

  1. 1. XML-funksjoner i MySQL
  2. 2. Xpath-støtte i Mysql <ul><li>Kom i versjon 5.1.5 (nytt™ i 2008!) </li></ul><ul><li>Ikke en del av ANSI-SQL </li></ul><ul><li>  </li></ul><ul><li>To nye SQL-funksjoner </li></ul><ul><li>ExtractValue() </li></ul><ul><li>UpdateXML() </li></ul>
  3. 3. fra år 2000 Mysql's xml-funksjoner er modellert etter Oracle sin.
  4. 4. Syntaks <ul><li>Tar to argumenter </li></ul><ul><li>  </li></ul><ul><li>SELECT  </li></ul><ul><li>    EXTRACTVALUE( <felt> , ' xpathuttrykk ' ) AS nyttalias </li></ul><ul><li>FROM <tabell> </li></ul><ul><li>; </li></ul><ul><li>Settes et alias (AS), er dette heretter nytt navn på (den deriverte) kolonna. Settes det ikke, er funksjonen navn kolonnenavn :-( </li></ul>
  5. 5. Xpath-uttrykk <ul><li>'/HTML/HEAD/TITLE'  </li></ul><ul><li>Henter CDATA fra <TITLE> </li></ul><ul><li>'//TABLE'   Henter alle CDATA under <TABLE> </li></ul><ul><li>'//TABLE/TD/TR[1]'   Henter innholdet fra første rad i en tabell </li></ul><ul><li>'/contacts/contactData/adr/street'   er det samme som '//street' (hvis en forekomst) </li></ul><ul><li>'/admissionInfo/studentPlaces/@places'   innholdet av atributtet @places </li></ul><ul><li>'//contactData[@userDefined=&quot;visit&quot;]/adr/street' gate som har attributt visit i contactData </li></ul><ul><li>'//refProgram/@idRef'  du kan referere til brukerdefinerte variabler </li></ul><ul><li>definers i  SET @vendor_id := 'vilbli.no' ; </li></ul>Forutsetninger - valid - case sensitive
  6. 6. og så ... virkeligheten :-O  øvelser her: www.groven.no/harald/Xpath_i_Mysql
  7. 7.  
  8. 8. Hvordan få data inn ? <ul><li>LOAD DATA INFILE ' /filbane/CDM_PRIMARY.xml ' INTO TABLE ` cdmxml_org `  </li></ul><ul><li>CHARACTER SET latin1   </li></ul><ul><li>FIELDS TERMINATED BY ' føkkyou '  </li></ul><ul><li>LINES TERMINATED BY ' <orgUnit> '  </li></ul><ul><li>; </li></ul><ul><li>Leser ikke tegnsett dynamsk :-( </li></ul><ul><li>FIELDS defaulter til ' ' </li></ul><ul><li>LINES defaulter til ' ' </li></ul><ul><li>Databasen må finnes først  </li></ul><ul><li>  </li></ul><ul><li>CREATE TABLE IF NOT EXISTS cdm.cdmxml_org (        xmldata longtext NOT NULL ) DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci </li></ul><ul><li>; </li></ul>
  9. 10. Datatransformasjon <ul><li>Hvordan flytte data fra en tabell til en annen i SQL, når tabellene har forskjellig antall kolonner og forskjellig kolonnenavn? Dette uten å dumpe ut som tekst? </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>GUIer for dette:  </li></ul><ul><li>MS-Access, Filemaker </li></ul><ul><li>Altova MapForce (xml)  </li></ul>
  10. 12. Fancy INSERTs <ul><li>Neandertalmetoden: </li></ul><ul><li>INSERT INTO `tabell` VALUES('greie1', 'verdi1', 'verdi2') ; INSERT INTO `tabell` VALUES('greie2', 'verdi1', 'verdi2') ; </li></ul><ul><li>Einstein-metoden: </li></ul><ul><li>INSERT INTO `tabell`  </li></ul><ul><li>    SELECT felt1, felt2, felt3 </li></ul><ul><li>    FROM `annentabell` </li></ul><ul><li>; </li></ul><ul><li>Forutsetninger:  </li></ul><ul><li>- Samme antall kolonner som i destinasjonstabellen ! </li></ul><ul><li>- Samme navn på kolonnnene som i destinasjonstabellen !! </li></ul><ul><li>- Ingen constraint-violations under importen !!! </li></ul>
  11. 13. INSERT INTO SELECTs <ul><li>Hva om kolonnene har forskjellig navn i de to tabellene? </li></ul><ul><li>  </li></ul><ul><li>INSERT INTO tabell  </li></ul><ul><li>    SELECT  </li></ul><ul><li>         A.etelleranna AS felt1,  </li></ul><ul><li>         A.hurra AS felt2,  </li></ul><ul><li>        A.foobar AS felt3 </li></ul><ul><li>    FROM annentabell A </li></ul><ul><li>;  </li></ul><ul><li>  </li></ul><ul><li>Tabellalias lar deg omdøpe kolonnne </li></ul>
  12. 14. INSERT INTO SELECTs <ul><li>Hva om du skal smæsje i hop data fra mange tabeller? </li></ul><ul><li>  </li></ul><ul><li>INSERT INTO tabell  </li></ul><ul><li>    SELECT  </li></ul><ul><li>         A.etelleranna AS felt1,  </li></ul><ul><li>         A.hurra AS felt2,  </li></ul><ul><li>        AA.foobar AS felt3 </li></ul><ul><li>FROM annentabell A </li></ul><ul><li>LEFT JOIN endaentabell AA ON (AA.id=A.id)    </li></ul><ul><li>;  </li></ul><ul><li>  </li></ul>
  13. 15. INSERT INTO SELECTs <ul><li>Hva om innholdet er av forskjellig datatype eller skal modifiseres? </li></ul><ul><li>  </li></ul><ul><li>INSERT INTO tabell  </li></ul><ul><li>    SELECT  </li></ul><ul><li>        CONCAT('http://', A.nettadresse) AS url,  </li></ul><ul><li>        REPLACE(A.innhold,' faen!',' huffda!') AS artikkel,  </li></ul><ul><li>        (DATEDIFF (U.login, '1970-01-01 00:00:00')         *86400) AS unixtid, </li></ul><ul><li>        'ja' AS svar -- konstant </li></ul><ul><li>  </li></ul><ul><li>FROM annentabell A </li></ul><ul><li>;  </li></ul><ul><li>  </li></ul><ul><li>Tips: Behold originaldata i egne tabeller, og fiks opp med funksjoner. Kjør på nytt om eksport går til helvete </li></ul>
  14. 16. Feilhåndtering under INSERT <ul><li>INSERT INTO SELECT </li></ul><ul><li>Stopper ved integritetsbrudd (integrety violation), som fx to poster med samme nøkkelverdi eller ulovlige verdier. For lange verdier trunkeres uten å stoppe innsetninga.   </li></ul><ul><li>INSERT IGNORE INTO SELECT  </li></ul><ul><li>Kjører videre ved feilmeldinger så lengen syntaksen i skriptet er gyldig.... Nyttig for å &quot;etterfylle&quot; </li></ul><ul><li>REPLACE INTO SELECT       genial !! </li></ul><ul><li>Hvis det finnes en post med samme primærnøkkelID -> UPDATE </li></ul><ul><li>Hvis det ikke finnes noen post med primærnøkkelID -> INSERT </li></ul>
  15. 17. CREATE TABLE SELECT <ul><li>Hva om tabellen det skal settes inn data i ikke finnes fra før? </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>CREATE TABLE flunkendenytabell  </li></ul><ul><li>    SELECT  </li></ul><ul><li>         felt1,  </li></ul><ul><li>         felt2,  </li></ul><ul><li>         felt3 </li></ul><ul><li>    FROM ` annentabell ` </li></ul><ul><li>; </li></ul><ul><li>  </li></ul><ul><li>Gjetter datatype på felt1, felt2 og felt3 ut fra innholdet og oppretter tabell med disse feltene.  </li></ul>
  16. 18. Sekvensverdier / sequences Genrere en unik ID for en tabell som ikke har det fra før CREATE TABLE tabellTMP ( nid INT(8) NOT NULL AUTO_INCREMENT, PRIMARY KEY ( nid ))     SELECT  *     FROM tabell_1 ;  Kolonna nid får nå en haug med ferske IDer... Hvis disse idnummerene er &quot;brukt opp&quot; kan en kjøre UPDATE tabellTMP SET nid = (nid +24999) ;  NB slå av primærnøkkelen, skru på igjen etter
  17. 19. CREATE TABLE SELECT <ul><li>Problemer med tabeller laga av CREATE TABLE SELECT s: </li></ul><ul><li>  </li></ul><ul><li>- For romslige datatyper som LONGTEXT , eller BLOB ved NULL-input. -> uindekserbar :-( </li></ul><ul><li>- Har du ikke data under opprettinga kan den lage INT(0) </li></ul><ul><li>-- Løsning :-D </li></ul><ul><li>CREATE TABLE IF NOT EXISTS cdm.orgunit ( </li></ul><ul><li>     org_importid INT(10) AUTO_INCREMENT NOT NULL,     vendor_id VARCHAR(100),     orgUnitID VARCHAR(50),     orgUnitName VARCHAR(100),     PRIMARY KEY tid(org_importid),     KEY orgUnitID (orgUnitID) ) SELECT * ...... FROM ..... ; </li></ul><ul><li>  </li></ul>
  18. 20. Importskriptsgenereringsskript <ul><li>SELECT   CONCAT(' -- ', `TABLE_NAME` , ' ' 'INSERT INTO ', `TABLE_SCHEMA` , '.', `TABLE_NAME` , ' SELECT '' AS ', GROUP_CONCAT(COLUMN_NAME ORDER BY ORDINAL_POSITION SEPARATOR ', '' AS ' ), ' FROM ', `TABLE_SCHEMA` , '.', `TABLE_NAME` , ' ; ' )   AS createstatement   FROM information_schema.COLUMNS   -- sett inn navn på database som skal WHERE TABLE_SCHEMA IN (' drupal ')   -- sett inn liste over tabeller det skal lages skript for AND TABLE_NAME IN (' node ', ' node_revisions ', ' url_alias ')   GROUP BY TABLE_NAME ; </li></ul>Eksporter outputten som tekst  Export -> CSV -> ingen skilletegn. Redigeres i teksteditor.

×