Tipul de dată XMLType

XMLType este un tip de dată care se foloseşte pentru gestiunea documentelor XML şi se poate utiliza pentru:

Utilizarea tipului de dată XMLType la definirea tabelelor

Intr-un tabel se poate include o coloană de tipul XMLType:
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;

Metode utile ale tipul XMLType

Metodele acestui tip obiect se pot obţine cu comanda:
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:

Exemple:
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;
In continuare se va crea o funcţie care generează un fragment XML dintr-o referinţă la un cursor. In funcţie se vor preciza două argumente care înlocuiesc tagurile ROWSET şi ROW cu denumiri utilizator (după Notes on Oracle).
Pentru a putea efectua operaţii, în PL/SQL, pe şirul de caractere memorat ca şi date de tipul clob trebuie ca un document XMLType să fie convertit la un astfel de tip de dată cu funcţia getClobVal.
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;  

View-uri sistem