В лекции № 7 "Введение в Oracle SQL" в подразделе "Несамостоятельность группировки с обобщениями ROLLUP, CUBE и GROUPING SETS" представленная таблица сравнения содержит ошибки - окончания запросов пропущены. Видимо, ошибки вызваны некорректным переносом материала лекции. |
Объектные типы данных в Oracle
Преобразование табличных данных в тип XMLTYPE
Ряд функций, объединенных названием SQL/XML в стандарте SQL:2003 (другое название — SQLX), позволяет просто осуществлять преобразование обычных табличных данных в формат XML. В Oracle реализованы следующие функции из этого стандартного набора:
- XMLELEMENT
- XMLATTRIBUTES
- XMLAGG
- XMLCONCAT
- XMLFOREST
- XMLPI[10.2-]
- XMLCOMMENT[10.2-]
- XMLROOT[10.2-]
- XMLSERIALIZE[10.2-]
- XMLPARSE[10.2-]
[10.2-] начиная с версии 10.2
Вдобавок к этому Oracle SQL содержит ряд расширений SQL/XML и собственных функций для выполнения подобных преобразований:
- XMLCOLATTVAL
- SYS_XMLGEN (распространяется на строки)
- SYS_XMLAGG (распространяется на группы GROUP BY)
- XMLSEQUENCE (только курсорный вариант)
- XMLCDATA[10.2-]
[10.2-] начиная с версии 10.2
Следующие примеры поясняют действие некоторых из перечисленных функций:
SET LONG 2000 SELECT XMLELEMENT ( "employee", ename ) AS employee FROM emp; SELECT XMLELEMENT ( "employee" , XMLATTRIBUTES ( ename AS "name", comm AS "commission" ) ) AS employee FROM emp; SELECT XMLELEMENT ( "employee" , XMLFOREST ( ename AS "name", comm AS "commission" ) ) AS employee FROM emp; SELECT XMLELEMENT ( "employee" , XMLCOLATTVAL ( ename AS "name", comm AS "commission" ) ) AS employee FROM emp; SELECT XMLELEMENT ( "department" , XMLATTRIBUTES ( deptno AS no ) ) AS department , XMLAGG ( XMLELEMENT ( "employee", ename ) ) AS employees FROM emp GROUP BY deptno ; Обратите внимание, что в результатах выдаются поля типа XMLTYPE: CREATE TABLE xtable ( n ) AS SELECT XMLELEMENT ( "name", ename ) FROM emp ; DESCRIBE xtable
Тип ANYDATA
Имеется начиная с версии 9. Позволяет хранить в столбце таблицы данные одновременно разных типов. Используется с объектным типом ANYDATA, имеющим свои конструкторы и методы.
Пример:
CREATE TABLE t ( x ANYDATA ); INSERT INTO t VALUES ( ANYDATA.CONVERTNUMBER ( 5 ) ); INSERT INTO t VALUES ( ANYDATA.CONVERTDATE ( SYSDATE ) ); INSERT INTO t VALUES ( ANYDATA.CONVERTVARCHAR2 ( 'hello world' ) ); SELECT t.x.GETTYPENAME ( ) typename FROM t t; INSERT INTO t VALUES ( ANYDATA.CONVERTOBJECT ( address_type ( '789012', 'Murmansk' ) ) );
Метода извлечения значения нефиксированного типа в SQL не предусмотрено, и извлечение приходится программировать в два захода: сначала узнать реальный тип значения, а потом уже применить соответствующий типу метод извлечения. Пример ниже подсказывает, как можно при желании составить функцию выборки данного, доступную в SQL, а не только в программе:
SET SERVEROUTPUT ON DECLARE val VARCHAR2 ( 30 ); anumber ANYDATA; BEGIN SELECT t.x INTO anumber FROM t t WHERE t.x.GETTYPENAME ( ) = 'SYS.NUMBER' -- в нашей таблице такая строка единственная ; DBMS_OUTPUT.PUT_LINE ( 'Ret code: ' || anumber.GETNUMBER ( val ) ); DBMS_OUTPUT.PUT_LINE ( 'A number: ' || val ); END; /
Методы типа ANYDATA описаны в документации по Oracle.
Тип ANYDATA, как и XMLTYPE, находит употребление во внутренней организации БД. В частности он используется в построении внутренних "автоматических очередей", лежащих в основе "потоков данных", используемых, в свою очередь, для автоматического переноса данных в Oracle.