CREATE TABLE XML1(c VARCHAR2(10) PRIMARY KEY, xml XMLType);
Se poate defini un tabel la care înregistrările să fie de tipul XMLType:
CREATE TABLE XML2 OF XMLType;
describe XMLTYPE;
Conversii (metode ale tipului obiect XMLType):
getClobVal() getStringVal() getNumberVal()
getClobVal() - furnizează o serializare a unei valori de tip XMLType. Valoarea obţinută este de tip CLOB
getStringVal() - furnizează un şir de caractere ca o serializare a documentului.
Textul rezultat trebuie să conţină cel mult 4000 caractere.
getNumberVal() - furnizează o valoare numerică. Instanţa XMLType trebuie să fie un nod text care conţine o valoare numerică.
Constructorul XMLType:
XMLType(xmlData IN clob, schema IN varchar2 := NULL, validated IN number := 0, wellformed IN Number := 0) return self as result XMLType(xmlData IN varchar2, schema IN varchar2 := NULL, validated IN number := 0, wellformed IN number := 0) return self as result XMLType(xmlData IN SYS_REFCURSOR, schema IN varchar2 := NULL, validated IN number := 0, wellformed IN number := 0) return self as result
Pentru a folosi valori de tipul XMLType trebuie ca acestea să fie construite.
Există mai multe variante de constructori, dintre care
s-au precizat numai trei.
Aşa după cum se observă din sintaxa de folosire, primul argument poate fi: un tip de data CLOB,
un şir de caractere, o referinţă la un cursor.
Valoarea acestui constructor este un document XML.
Următoarele argumente sunt opţionale şi au semnificaţia:
INSERT INTO XML1 VALUES ('1', xmltype('<?xml version="1.0"?> <FACULTATE> <SECTIE> <COD>2</COD> <DENUMIRE>Informatica</DENUMIRE> </SECTIE> </FACULTATE>'));
declare c DBMS_XMLGEN.ctxType; r CLOB; begin -- crearea unui context c := DBMS_XMLQuery.newContext('select * from sectii'); -- precizeaza denumirea tagului radacina DBMS_XMLQuery.setRowSetTag (c, 'FACULTATE'); -- precizeaza denumirea tagului pentru inregistrari DBMS_XMLQuery.setRowTag (c, 'SECTIE'); -- determina documentul XML r := DBMS_XMLQuery.getXML(c); INSERT INTO XML1 VALUES ('2',xmltype(r)); -- inchiderea contextului DBMS_XMLQuery.closeContext(c); end; / select * from xml1;
Tipul de dată sys_refcursor se foloseşte pentru a trece cursoare ca parametri la procedurile memorate (se precizează
un parametru de tipul sys_refcursor).
Pentru a vedea deosebirea dintre un tip ref cursor (care se foloseşte cu un tip de rezultat memorat în baza de date)
şi sys_refcursor (care nu precizează tipul rezultatului) se poate consulta
http://mynotes-oracle.blogspot.ro/2010/01/oracle-reference-cursors.html.
Intr-un bloc PL/SQL putem atribui o valoare pentru o variabilă de tipul sys_refcursor printr-o instrucţiune de forma:
OPEN variabila_refcur FOR instructiune_SELECT;
create or replace function refc_to_xml(refc in sys_refcursor, tag_rowset in varchar2, tag_row in varchar2) return xmltype is v xmltype; c clob; begin v := xmltype(refc); c := v.getClobVal(); c := replace (c, '<ROWSET>', '<' || tag_rowset || '>'); c := replace (c, '</ROWSET>', '</' || tag_rowset || '>'); c := replace (c, '<ROW>', '<' || tag_row || '>'); c := replace (c, '</ROW>', '</' || tag_row || '>'); v := xmltype(c); return v; end;
Următorul bloc va genera şi extrage un document XML (nu se vor folosi pachete, ca de exemplu pachetul DBMS_XMLGEN):
set serveroutput on declare refc sys_refcursor; x xmltype; y clob; begin open refc for select * from sectii; x := refc_to_xml(refc,'FACULTATE','SECTIE'); y:=x.getClobVal(); ExtrageCLOB(y); end;