XML Repository. Maciej Zakrzewicz. mzakrz@cs.put.poznan.pl http://www.cs.put.poznan.pl/~mzakrz/



Podobne dokumenty
Generowanie dokumentów XML z tabel relacyjnych - funkcje SQLX

Tworzenie raportów XML Publisher przy użyciu Data Templates

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Pakiety podprogramów Dynamiczny SQL

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

PL/SQL. Zaawansowane tematy PL/SQL

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Model semistrukturalny

15. Funkcje i procedury składowane PL/SQL

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Język PL/SQL Pakiety podprogramów

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Oracle PL/SQL. Paweł Rajba.

Wykorzystywanie parsera DOM w programach Java i PL/SQL

Oracle PL/SQL. Paweł Rajba.

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Język PL/SQL Procedury i funkcje składowane

Język SQL, zajęcia nr 1

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Plan. Wprowadzenie. Co to jest APEX? Wprowadzenie. Administracja obszarem roboczym

Bloki anonimowe w PL/SQL

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

PODSTAWY BAZ DANYCH 13. PL/SQL

SYSTEM INFORMATYCZNY KS-SEW

Standard SQL/XML. Wprowadzenie do XQuery

Procedury i funkcje składowane

Ćwiczenia 2 IBM DB2 Data Studio

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Systemowe aspekty baz

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Uprawnienia, role, synonimy

Plan wykładu BAZY DANYCH II WYKŁAD 9. Dynamiczny SQL. Dynamiczny SQL

Monika Kruk Mariusz Grabowski. Informatyka Stosowana WFiIS, AGH 13 grudzień 2006

Oracle PL/SQL. Paweł Rajba.

Oracle 12c: Nowości w SQL i PL/SQL

Zbiór pytań nr 5. 2 Które stwierdzenie opisuje najlepiej zbiór uprawnień dostępny po wykonaniu

Modelowanie wymiarów

Składowane procedury i funkcje

Deklarowanie kursora. CURSOR nazwa [ ( param1 typ1 [,param2 typ2]... ) ] [RETURN typ zwracany] IS zapytanie SQL;

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

Systemowe aspekty baz danych

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

Porównanie wydajnoœci bibliotek XML-owych w Oracle 9i

XML w bazie danych IBM DB2

Zarządzanie kontami użytkowników w i uprawnieniami

Rozszerzenia języka relacyjnych baz danych SQL

1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) możemy określić do której grupy plików trafi

Zaawansowane bazy danych i hurtownie danych semestr I

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Oracle11g: Wprowadzenie do SQL

Wybór EUROPEAN będzie rozpoznawał dzień przed miesiącem, natomiast US miesiąc przed dniem.

XML w bazach danych i bezpieczeństwie

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Język SQL. Rozdział 9. Język definiowania danych DDL, cześć 1. Tworzenie relacji, typy danych, wartości domyślne atrybutów, słownik bazy danych.

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

Bazy danych. dr inż. Arkadiusz Mirakowski

Post-relacyjne bazy danych

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

Obiektowe bazy danych

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Plan prezentacji. Budowa aplikacji w technologii Enterprise JavaBeans. Przegląd architektur: CORBA. Cele budowy aplikacji rozproszonych

1 XML w bazach danych

Plan ćwiczenia. Rozdział 16 Uwierzytelnianie i autoryzacja w bazie danych. Użytkownicy i schematy (1) Użytkownicy i schematy (2) baza danych: ZESP99

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

Zadania SELECT do schematu EDS (EMP, DEPT, SALGRADE)

Instrukcje DML INSERT, UPDATE, DELETE. COPY

Multimedialne bazy danych - laboratorium

Wykład 8. SQL praca z tabelami 5

Technologie semantyczne i sieci społecznościowe laboratorium

Język PL/SQL. Rozdział 4. Procedury i funkcje składowane

Plan wykładu BAZY DANYCH II WYKŁAD 5. Kolekcje. Tablice asocjacyjne Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone

SQL (ang. Structured Query Language)

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

Obiektowe bazy danych Ćwiczenia laboratoryjne (?)

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

PODSTAWY BAZ DANYCH. 17. Obiektowość w Oracle. 2009/2010 Notatki do wykładu "Podstawy baz danych"

Bazy danych. Polecenia SQL

Oracle10g: Programowanie w PL/SQL

XML w bazach danych i bezpieczeństwie

1. Wyzwalacze BD (ang. triggers)

Bazy Danych i Usługi Sieciowe

Przykład połączenie z bazą danych

1 Wprowadzenie do bloków nazwanych 1. 2 Parametry 2. 3 Procedury i funkcje 3. 4 Pakiety 6. 5 Podsumowanie Źródła 10

Programowanie w Ruby

2 Natywne bazy XML Języki zapytań XQuery Źródła 14

Transkrypt:

XML Repository Maciej Zakrzewicz mzakrz@cs.put.poznan.pl http://www.cs.put.poznan.pl/~mzakrz/

Charakterystyka XML Repository Repozytorium dokumentów XML (XML Repository) jest usługą serwera bazy danych Oracle9iR2, umożliwiającą przechowywanie i udostępnianie dokumentów XML (również innych plików) w formie wirtualnego systemu plików, implementowanego wewnątrz bazy danych Dostęp do repozytorium dokumentów XML jest możliwy poprzez FTP, WebDAV/HTTP lub SQL Dokumenty i foldery umieszczane w repozytorium są zapisywane w tabelach bazy danych; programista posiada dostęp do tych tabel m.in. poprzez funkcje pakietu DBMS_XDB

FTP Dostęp do XML Repository WebDAV/HTTP HTTP SQL

Początkowa struktura folderów / public sys xdbconfig.xml Pliki użytkowników powinny być umieszczane wewnątrz folderu public. Folder sys służy wyłącznie do przechowywania plików systemowych. Plik xdbconfig.xml przechowuje dane o konfiguracji repozytorium (m.in. numery portów). W folderze /sys/schemas widoczne są wszystkie schematy zarejestrowane w bazie danych. acls log schemas all_all_acl.xml PUBLIC SCOTT all_owner_acl.xml bootstrap_acl.xml www.w3.org xmlns.oracle.com ro_all_acl.xml

Pakiet DBMS_XDB Funkcja CreateFolder definiuje nowy folder w drzewie dokumentów XML Repository declare retb boolean; begin retb := dbms_xdb.createfolder('/public/nowyfolder'); commit; end; Funkcja CreateResource umieszcza w drzewie dokumentów XML Repository nowy dokument declare retb boolean; begin retb := dbms_xdb.createresource('/public/nowyfolder/scott_emp.xml', '<employee><ename>scott</ename></employee>'); commit; end;

Pakiet DBMS_XDB Funkcja Link definiuje dodatkową ścieżkę (skrót) do dokumentu w XML Repository begin dbms_xdb.link('/public/nowyfolder/scott_emp.xml','/public','scott.xml'); commit; end; Funkcja DeleteResource usuwa ścieżkę do dokumentu w XML Repository. Po usunięciu wszystkich ścieżek dokument zostanie usunięty. begin dbms_xdb.deleteresource('/public/nowyfolder/scott_emp.xml'); commit; end;

Dostęp do XML Repository przy pomocy SQL 1. Zarejestruj schemat XML, zgodnie z którym przygotowane będą dokumenty exec dbms_xmlschema.registeruri( 'myemp', 'http://miner/myemp'); W bazie danych utworzona zostanie tabela obiektów oraz typy obiektowe, które posłużą do składowania dokumentów wykorzystujących zarejestrowany schemat. Tabela zostanie utworzona na koncie tego użytkownika, który rejestruje schemat XML. Wszystkie dokumenty powołujące się na zarejestrowany schemat będą umieszczane w tej tabeli. Listę tabel, przechowujących dokumenty XML można uzyskać dzięki zapytaniu do perspektywy słownika danych USER_XML_TABLES (lub DBA_XML_TABLES) SELECT table_name, xmlschema FROM user_xml_tables; TABLE_NAME XMLSCHEMA ------------------------------ ----------------- ROWSET65_TAB myemp.xsd 2. Korzystając z FTP lub HTTP, umieść w XML Repository dokumenty XML. Każdy dokument powinien powoływać się na zarejestrowany wcześniej schemat. Dokumenty będą automatycznie umieszczane w tabeli powiązanej ze schematem XML. 3. Korzystając z perspektyw RESOURCE_VIEW, PATH_VIEW i tabel składowania dokumentów XML, wykonuj zapytania przeszukujące repozytorium XML.

Perspektywa RESOURCE_VIEW Perspektywa RESOURCE_VIEW zawiera po jednym rekordzie dla każdego pliku przechowywanego w repozytorium. W rekordzie tym zapisana jest ścieżka dostępu oraz obiekt XMLType, reprezentujący metadane dokumentu. SELECT any_path FROM resource_view WHERE any_path LIKE '/public%' ANY_PATH ------------------------------------------------- /public /public/nowyfolder /public/scott.xml Zawartość dokumentów może zostać odczytana z tabeli, jaka została utworzona podczas rejestrowania schematu XML. SELECT value(p) FROM ROWSET65_TAB;

Oracle XML SQL Utility Maciej Zakrzewicz mzakrz@cs.put.poznan.pl http://www.cs.put.poznan.pl/~mzakrz/

Oracle XML SQL Utility - XSU XML SQL Utility zawiera zbiór klas Java, które umożliwiają realizację następujących zadań: generowanie dokumentów XML na podstawie wyników zapytań SQL ładowanie danych XML do bazy danych Oracle SQL XSU XML XML XSU Oracle Oracle

Wykorzystanie XSU do generowania dokumentów XML na podstawie zapytań SQL set CLASSPATH=%CLASSPATH%;\xmlparserv2.jar;\classes12.jar;\xsu12.jar java OracleXML getxml -user scott/tiger "select * from emp" EMP Generowanie dokumentu XML zawierającego wszystkie rekordy tabeli EMP, znajdującej się w bazie danych w schemacie użytkownika SCOTT. Znaczniki rowset i row są generowane automatycznie. Nazwy pozostałych znaczników pochodzą od nazw kolumn tabeli. <?xml version = '1.0'?> <ROWSET> <ROW num="1"> <EMPNO>7369</EMPNO> <ENAME>SMITH</ENAME> <JOB>CLERK</JOB> <MGR>7902</MGR> <HIREDATE>12/17/1980 0:0:0</HIREDATE> <SAL>800</SAL> <DEPTNO>20</DEPTNO> </ROW> <ROW num="2"> </ROW> </ROWSET>

Wykorzystanie XSU do generowania dokumentów XML na podstawie zapytań SQL java OracleXML getxml -user scott/tiger -withdtd -rowsettag employees -rowtag employee -rowidcolumn EMPNO -uselowercase -encoding windows-1250 "select empno, ename, job, sal, comm from emp" <?xml version = '1.0' encoding = 'windows-1250'?> <!DOCTYPE employees [ <!ELEMENT employees (employee)*> <!ELEMENT employee (empno, ename?, job?, sal?, comm?)> <!ATTLIST employee num CDATA #REQUIRED> <!ELEMENT empno (#PCDATA)> <!ELEMENT ename (#PCDATA)> <!ELEMENT job (#PCDATA)> <!ELEMENT sal (#PCDATA)> <!ELEMENT comm (#PCDATA)>]> <employees> <employee num="7369"> <empno>7369</empno> <ename>smith</ename> <job>clerk</job> <sal>800</sal> </employee> -withdtd: generuj DTD -rowsettag: nazwa znacznika otaczającego -rowtag: nazwa znacznika rekordów -rowidcolumn: kolumna generująca identyfikatory -uselowercase: znaczniki małymi literami -encoding: strona kodowa dla znaków Generowanie dokumentu XML zawierającego wszystkie rekordy tabeli EMP, znajdującej się w bazie danych w schemacie użytkownika SCOTT. Dokument zawiera DTD, znacznik otaczający nazywa się employees, każdy rekord oznaczany jest znacznikiem employee. Wszystkie znaczniki zapisywane są małymi literami. Strona kodowania znaków to windows-1250.

Wykorzystanie XSU do generowania dokumentów XML na podstawie zapytań SQL java OracleXML getxml -user scott/tiger -withschema "select ename, job, sal from emp" <?xml version = '1.0'?><DOCUMENT xmlns:xsd="http://www.w3.org/2000/10/xmlschema"> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/xmlschema"> <xsd:element name="rowset"><xsd:complextype><xsd:sequence> <xsd:element name="row" minoccurs="0" maxoccurs="unbounded"><xsd:complextype> <xsd:sequence> <xsd:element name="ename" type="xsd:string" nullable="true" minoccurs="0"/> <xsd:element name="job" type="xsd:string" nullable="true" minoccurs="0"/> <xsd:element name="sal" type="xsd:float" nullable="true" minoccurs="0"/> </xsd:sequence> <xsd:attribute name="num" type="xsd:integer"/> </xsd:complextype></xsd:element> </xsd:sequence></xsd:complextype></xsd:element> </xsd:schema> <ROWSET xmlns:xsi="http://www.w3.org/2000/10/xmlschema-instance" xsi:nonamespaceschemalocation="#/document/xsd:schema[not(@targetnamespace)]"> <ROW num="1"> <ENAME>SMITH</ENAME> <JOB>CLERK</JOB> <SAL>800</SAL> </ROW> -withschema: generuj XML Schema Generowanie dokumentu XML zawierającego wszystkie rekordy tabeli EMP, znajdującej się w bazie danych w schemacie użytkownika SCOTT. Automatyczne generowanie definicji XML Schema na podstawie definicji tabeli w bazie danych.

Ładowanie danych XML do tabel bazy danych przy pomocy XSU java OracleXML putxml -user scott/tiger -filename emp.xml emp2 <?xml version = '1.0'?> <ROWSET> <ROW num="1"> <EMPNO>7369</EMPNO> <ENAME>SMITH</ENAME> <JOB>CLERK</JOB> <MGR>7902</MGR> <HIREDATE>12/17/1980 0:0:0</HIREDATE> <SAL>800</SAL> <DEPTNO>20</DEPTNO> </ROW> <ROW num="2"> <EMPNO>7499</EMPNO> <ENAME>ALLEN</ENAME> <JOB>SALESMAN</JOB> EMP2 Załadowanie do tabeli EMP2 rekordów zapisanych w pliku emp.xml. Znacznik rowset otacza cały zbiór rekordów, znaczniki row otaczają każdy rekord. Wartości znaczników są ładowane do kolumn o takich samych nazwach, jak nazwy znaczników.

Wykorzystywanie XSU Java API import oracle.jdbc.driver.*; import java.sql.*; import oracle.xml.sql.query.oraclexmlquery; DriverManager.registerDriver(new oracle.jdbc.driver.oracledriver()); Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@","scott","tiger"); OracleXMLQuery qry = new OracleXMLQuery (conn, "select * from emp"); qry.uselowercasetagnames(); qry.setrowsettag("employees"); qry.setrowtag("employee"); qry.setencoding("windows-1250"); String xmlstring = qry.getxmlstring(); System.out.println(xmlString); qry.close(); lub: XMLDocument xmldoc = qry.getxmldom(); Generowanie i wyświetlenie dokumentu XML zawierającego wszystkie rekordy tabeli EMP, znajdującej się w bazie danych w schemacie użytkownika SCOTT.

Wykorzystywanie XSU Java API import oracle.jdbc.driver.*; import java.sql.*; import oracle.xml.sql.dml.oraclexmlsave; DriverManager.registerDriver(new oracle.jdbc.driver.oracledriver()); Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@","scott","tiger"); OracleXMLSave sav = new OracleXMLSave(conn, "emp2"); sav.insertxml(sav.createurl("file://c:/emp.xml")); sav.close(); Załadowanie do tabeli EMP2 rekordów zapisanych w pliku emp.xml. Znacznik rowset otacza cały zbiór rekordów, znaczniki row otaczają każdy rekord. Wartości znaczników są ładowane do kolumn o takich samych nazwach, jak nazwy znaczników.

Wykorzystywanie XSU Java API import oracle.jdbc.driver.*; import java.sql.*; import oracle.xml.sql.dml.oraclexmlsave; DriverManager.registerDriver(new oracle.jdbc.driver.oracledriver()); Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@","scott","tiger"); OracleXMLSave sav = new OracleXMLSave(conn, "emp"); String [] keycolnames = new String[1]; keycolnames[0] = "EMPNO"; sav.setkeycolumnlist(keycolnames); sav.updatexml(sav.createurl("file://c:/emp.xml")); sav.close(); Modyfikacja rekordów tabeli EMP. Rekordy wymienione w pliku emp.xml, dopasowywane według wartości kolumny empno, otrzymują nowe wartości tych kolumn, które wymienione są w pliku emp.xml. <?xml version = '1.0'?> <ROWSET> <ROW num="1"> <EMPNO>7369</EMPNO> <ENAME>KOWALSKI</ENAME> </ROW> <ROW num="2"> <EMPNO>7499</EMPNO> <SAL>2000</SAL> <COMM>1500</COMM> </ROW> </ROWSET>

Wykorzystywanie XSU Java API import oracle.jdbc.driver.*; import java.sql.*; import oracle.xml.sql.dml.oraclexmlsave; DriverManager.registerDriver(new oracle.jdbc.driver.oracledriver()); Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@","scott","tiger"); OracleXMLSave sav = new OracleXMLSave(conn, "emp"); sav.deletexml(sav.createurl("file://c:/emp.xml")); sav.close(); Usunięcie z tabeli EMP wszystkich rekordów, które spełniają warunek "empno=7369 and ename='kowalski'" lub "empno=7499 and sal=2000 and comm=1500" <?xml version = '1.0'?> <ROWSET> <ROW num="1"> <EMPNO>7369</EMPNO> <ENAME>KOWALSKI</ENAME> </ROW> <ROW num="2"> <EMPNO>7499</EMPNO> <SAL>2000</SAL> <COMM>1500</COMM> </ROW> </ROWSET>

Wykorzystywanie XSU PL/SQL API declare queryctx DBMS_XMLquery.ctxType; result CLOB; begin queryctx := DBMS_XMLQuery.newContext('select * from emp'); result := DBMS_XMLQuery.getXML(queryCtx); printclobout(result); DBMS_XMLQuery.closeContext(queryCtx); end; Generowanie dokumentu XML zawierającego wszystkie rekordy tabeli EMP, znajdującej się w bazie danych. Wynikowy dokument XML znajduje się w zmiennej result, która może zostać zapisana do tabeli, pliku lub wyświetlona na ekranie. Zastąpienie wywołania funkcji getxml() funkcją getdtd() umożliwiłoby wygenerowanie definicji DTD dla konstruowanego dokumentu.

Przykładowa implementacja procedury PrintClobOut CREATE OR REPLACE PROCEDURE printclobout(result IN OUT NOCOPY CLOB) is xmlstr varchar2(32767); line varchar2(2000); begin xmlstr := dbms_lob.substr(result,32767); loop exit when xmlstr is null; line := substr(xmlstr,1,instr(xmlstr,chr(10))-1); dbms_output.put_line(' ' line); xmlstr := substr(xmlstr,instr(xmlstr,chr(10))+1); end loop; end; Procedura pochodzi z dokumentacji Oracle: Oracle9i XML Developer's Kit Guide -XDK

Wykorzystywanie XSU PL/SQL API declare insctx DBMS_XMLSave.ctxType; rows number; xmldoc CLOB; begin xmldoc := '<?xml version = ''1.0''?><ROWSET><ROW num="1">' '<EMPNO>7369</EMPNO><ENAME>KOWALSKI</ENAME>' '</ROW></ROWSET>'; insctx := DBMS_XMLSave.newContext('emp'); rows := DBMS_XMLSave.insertXML(insCtx,xmlDoc); DBMS_XMLSave.closeContext(insCtx); end; Załadowanie podanego dokumentu XML do tabeli EMP. Wstawiony zostanie nowy rekord, w którym wypełnione będą pola empno i ename. Podobnie realizowane mogą być operacje modyfikacji i usuwania rekordów w oparciu o dokument XML (jak w Java).

Generowanie dokumentów XML przy użyciu funkcji i pakietów Oracle Maciej Zakrzewicz mzakrz@cs.put.poznan.pl http://www.cs.put.poznan.pl/~mzakrz/

Pakiet DBMS_XMLGEN Pakiet DBMS_XMLGEN stanowi alternatywę dla Oracle XML SQL Utility. Oferuje interfejs PL/SQL i umożliwia generowanie dokumentów XML w oparciu o zapytania SQL. declare qryctx DBMS_XMLGEN.ctxHandle; result CLOB; begin qryctx := DBMS_XMLGEN.newContext('SELECT * FROM emp'); result := DBMS_XMLGEN.getXML(qryCtx); printclobout(result); DBMS_XMLGEN.closeContext(qryCtx); end; Wynikiem działania funkcji getxml() jest wartość typu CLOB, zawierająca dokument XML.

Pakiet DBMS_XMLGEN - transformacja domyślna Każdy rekord wyniku zapytania jest zamieniany na znacznik ROW Zbiór rekordów wynikowych jest otaczany znacznikiem ROWSET Nazwa każdej kolumny wyniku zapytania staje się nazwą znacznika zagnieżdżonego wewnątrz ROW Dane binarne są reprezentowane heksadecymalnie <?xml version="1.0"?> <ROWSET> <ROW> <EMPNO>7369</EMPNO> <ENAME>SMITH</ENAME> <JOB>CLERK</JOB> <MGR>7902</MGR> <HIREDATE>80/12/17</HIREDATE> <SAL>800</SAL> <DEPTNO>20</DEPTNO> </ROW> <ROW> </ROWSET>

Pakiet DBMS_XMLGEN - transformacja zaawansowana dbms_xmlgen.newcontext() dbms_xmlgen.setrowtag(), dbms_xmlgen.setrowsettag(), dbms_xmlgen.setmaxrows(), dbms_xmlgen.setskiprows() dbms_xmlgen.getxml() dbms_xmlgen.closecontext() setrowtag(): ustawia nazwę znacznika otaczającego każdy rekord setrowsettag(): ustawia nazwę znacznika otaczającego cały zbiór rekordów setmaxrows(): ogranicza liczbę rekordów, na podstawie których powstaje dokument XML w wyniku jednokrotnego wywołania getxml() setskiprows(): wskazuje liczbę rekordów, które powinny zostać pominięte, licząc od początku wyniku zapytania

Pakiet DBMS_XMLGEN - transformacja zaawansowana declare qryctx DBMS_XMLGEN.ctxHandle; result CLOB; begin qryctx := DBMS_XMLGEN.newContext('SELECT * FROM emp'); DBMS_XMLGEN.setRowTag(qryCtx, 'EMPLOYEE'); DBMS_XMLGEN.setRowsetTag(qryCtx, 'EMPLOYEES'); DBMS_XMLGEN.setMaxRows(qryCtx, 1); loop result := DBMS_XMLGEN.getXML(qryCtx); exit when DBMS_XMLGEN.getNumRowsProcessed(qryCtx) = 0; printclobout(result); end loop; DBMS_XMLGEN.closeContext(qryCtx); end; <?xml version="1.0"?> <EMPLOYEES> <EMPLOYEE> <EMPNO>7369</EMPNO> <ENAME>SMITH</ENAME> <JOB>CLERK</JOB> <MGR>7902</MGR> <HIREDATE>80/12/17</HIREDATE> <SAL>800</SAL> <DEPTNO>20</DEPTNO> </EMPLOYEE> </EMPLOYEES> <?xml version="1.0"?> <EMPLOYEES> <EMPLOYEE> <EMPNO>7499</EMPNO>

DBMS_XMLGEN: transformacja danych obiektowych CREATE TYPE EMP_T AS OBJECT ( ); EMPNO NUMBER(4), ENAME VARCHAR2(10), JOB VARCHAR2(9), SAL NUMBER(7,2) CREATE TYPE EMPLIST_T AS TABLE OF EMP_T; CREATE TYPE DEPT_T AS OBJECT ( ); DEPTNO NUMBER, DNAME VARCHAR2(14), LOC VARCHAR2(13), EMPLIST EMPLIST_T declare qryctx DBMS_XMLGEN.ctxHandle; result CLOB; begin qryctx := DBMS_XMLGEN.newContext( 'SELECT dept_t(deptno,dname,loc, CAST(MULTISET( select empno, ename, job, sal from emp e where e.deptno = d.deptno ) AS emplist_t)) AS department FROM dept d'); result := DBMS_XMLGEN.getXML(qryCtx); printclobout(result); DBMS_XMLGEN.closeContext(qryCtx); end; <?xml version="1.0"?> <ROWSET> <ROW> <DEPARTMENT> <DEPTNO>10</DEPTNO> <DNAME>ACCOUNTING</DNAME> <LOC>NEW YORK</LOC> <EMPLIST> <EMP_T> <EMPNO>7782</EMPNO> <ENAME>CLARK</ENAME> <JOB>MANAGER</JOB> <SAL>2450</SAL> </EMP_T> <EMP_T> <EMPNO>7839</EMPNO> <ENAME>KING</ENAME> <JOB>PRESIDENT</JOB> <SAL>5000</SAL> </EMP_T> <EMP_T> <EMPNO>7934</EMPNO>

Funkcja SYS_XMLGEN() Funkcja SYS_XMLGEN() pobiera wartość skalarną, obiektową lub XMLType i zwraca dobrze uformowany dokument XML reprezentowany przez typ XMLType. W przeciwieństwie do pakietu DBMS_XMLGEN, który operował na poziomie całego zapytania SQL, funkcja SYS_XMLGEN() operuje na poziomie pojedynczego rekordu. SQL> SELECT SYS_XMLGEN(ename).getStringVal() FROM emp WHERE ename = 'KING'; SYS_XMLGEN(ENAME).GETSTRINGVAL() -------------------------------------------------------------------------------- <?xml version="1.0"?> <ENAME>KING</ENAME>

Funkcja SYS_XMLGEN() - parametry SELECT SYS_XMLGEN(ename, XMLFormat.createFormat('name')).getStringVal() FROM emp <?xml version="1.0"?> <name>smith</name> <?xml version="1.0"?> <name>allen</name> <?xml version="1.0"?> <name>ward</name> <?xml version="1.0"?> <name>jones</name> Metoda XMLFormat.createFormat() umożliwia wyspecyfikowanie nazwy znacznika otaczającego, nazwę schematu XML, itp.

SYS_XMLGEN: transformacja danych obiektowych CREATE TYPE EMP_T AS OBJECT ( ); EMPNO NUMBER(4), ENAME VARCHAR2(10), JOB VARCHAR2(9), SAL NUMBER(7,2) CREATE TYPE EMPLIST_T AS TABLE OF EMP_T; CREATE TYPE DEPT_T AS OBJECT ( ); DEPTNO NUMBER, DNAME VARCHAR2(14), LOC VARCHAR2(13), EMPLIST EMPLIST_T SELECT SYS_XMLGEN( dept_t(deptno, dname, loc, CAST(MULTISET( select empno, ename, job, sal from emp e where e.deptno = d.deptno ) AS emplist_t))).getstringval() FROM dept d <?xml version="1.0"?> <ROW> <DEPTNO>10</DEPTNO> <DNAME>ACCOUNTING</DNAME> <LOC>NEW YORK</LOC> <EMPLIST> <EMP_T> <EMPNO>7782</EMPNO> <ENAME>CLARK</ENAME> <JOB>MANAGER</JOB> <SAL>2450</SAL> </EMP_T> <EMP_T> <EMPNO>7839</EMPNO> <ENAME>KING</ENAME> <JOB>PRESIDENT</JOB> <SAL>5000</SAL> </EMP_T> <EMP_T> <EMPNO>7934</EMPNO> <ENAME>MILLER</ENAME>

Funkcja SYS_XMLAGG() SELECT SYS_XMLAGG(SYS_XMLGEN(ename)).getStringVal() FROM emp <?xml version="1.0"?> <ROWSET> <ENAME>SMITH</ENAME> <ENAME>ALLEN</ENAME> <ENAME>WARD</ENAME> <ENAME>JONES</ENAME> <ENAME>MARTIN</ENAME> <ENAME>BLAKE</ENAME> <ENAME>CLARK</ENAME> <ENAME>SCOTT</ENAME> <ENAME>KING</ENAME> <ENAME>TURNER</ENAME> <ENAME>ADAMS</ENAME> <ENAME>JAMES</ENAME> <ENAME>FORD</ENAME> <ENAME>MILLER</ENAME> </ROWSET> Funkcja SYS_XMLAGG jest funkcją grupową, która łączy wiele dokumentów XML lub ich fragmentów w jeden dokument, otoczony znacznikiem ROWSET (możliwa zmiana przy pomocy XMLFormat)

Przeszukiwanie danych XML przy użyciu funkcji Oracle Text Maciej Zakrzewicz mzakrz@cs.put.poznan.pl http://www.cs.put.poznan.pl/~mzakrz/

Własności Oracle Text Moduł Oracle Text może być wykorzystany do przeszukiwania dokumentów XML przechowywanych w bazie danych Podstawową funkcją Oracle Text, znajdującą zastosowanie w przetwarzaniu danych XML jest Contains(), służąca do zbadania, czy podane słowo znajduje się we wskazanej sekcji dokumentu W celu użycia funkcji Contains(), dokumenty XML muszą zostać podzielone na sekcje, a następnie na sekcjach musi zostać utworzony indeks typu ctxsys.context Podział dokumentu na sekcje może odbywać się automatycznie, w oparciu o wszystkie znaczniki XML, lub w wyniku manualnego deklarowania sekcji przez programistę

Automatyczny podział dokumentu na sekcje Utworzenie przykładowej tabeli create table myxml (doc_id number(6), doc xmltype); insert into myxml values (1, xmltype.createxml('<row num="4"><empno>7566')); Zbudowanie indeksu na sekcjach automatycznie wygenerowanych ze znaczników create index myindex on myxml(doc) indextype is ctxsys.context parameters ('section group ctxsys.auto_section_group'); Przeszukiwanie sekcji dokumentu select doc_id from myxml where contains(doc, 'salesman within JOB and Allen within ENAME') > 0 select doc_id from myxml where contains(doc, '3 within ROW@num') > 0;

Podział na sekcje definiowany przez programistę Zdefiniowanie wszystkich sekcji w dokumencie (na potrzeby wyszukiwania) begin -- wymagane uprawnienie execute na ctx_ddl ctx_ddl.create_section_group('myxmlgroup', 'XML_SECTION_GROUP'); ctx_ddl.add_zone_section('myxmlgroup', 'nazwisko', 'ENAME'); ctx_ddl.add_attr_section('myxmlgroup', 'num_rekordu', 'ROW@num'); end; Zbudowanie indeksu na zdefiniowanych sekcjach create index myindex on myxml(doc) indextype is ctxsys.context parameters ('section group myxmlgroup'); Przeszukiwanie sekcji dokumentu (tylko tych, które zostały zdefiniowane) select doc_id from myxml where contains(doc, '3 within num_rekordu') > 0; select doc_id from myxml where contains(doc, 'Allen within nazwisko') > 0;

Automatyczny podział na sekcje wg ścieżek Zastosowanie automatycznego podziału dokumentu na sekcje wg ścieżek begin ctx_ddl.create_section_group('xmlpathgroup', 'PATH_SECTION_GROUP'); end; Zbudowanie indeksu na zdefiniowanych sekcjach create index myindex on myxml(doc) indextype is ctxsys.context parameters ('section group xmlpathgroup'); Przeszukiwanie sekcji dokumentu (dostępnych jest wiele elementów języka XPath) select doc_id from myxml where contains(doc, 'salesman inpath (ROW/JOB)') > 0; select doc_id from myxml where contains(doc, 'haspath (//COMM)') > 0;