Функции Oracle (RU)

    Функции аналогичны операторам в том, что они управляют элементами данных и 
возвращают результат. Функции отличаются от операторов форматом аргументов. Этот
формат позволяет им работать с нулем, одним, двумя или более аргументами:
function(argument, argument, ...)
    Функция без аргументов похожа на псевдоколонку. Однако псевдоколонка обычно
возвращает разное значение для каждой строки, тогда как функция без аргументов 
возвращает одинаковое значение для каждой строки.
    Эта глава содержит следующие разделы:
* Об SQL функциях
* Однорядные функции:
    - Числовые фукнции
    - Символьные функции, возвращающие символьные значения
    - Символьные функции, возвращающие числовые значения
    - Функции для работы с набором символов
    - Функции для работы с датами
    - Основные функции сравнения
    - Функции преобразования
    - Функции для LOB объектов
    - Функции коллекции
    - Функции для работы с иерархией
    - Функции для анализа данных
    - Функции XML
    - Функции JSON
    - Функции кодирования и декодирования
    - Функции для работы с NULL-взаимосвязанными данными
    - Функции окружения (среды) и идентификатора
* Агрегатные функции
* Аналитические функции
* Функции ссылки на объект
* Функции MODEL
* Функции OLAP
* Функции картриджа данных
    
ОБ SQL ФУНКЦИЯХ
    SQL функции встроены в базу данных Oracle.
Примечание. Когда вы применяете функции SQL к столбцам больших объектов, Oracle
создает временные большие объекты во время SQL и PL/SQL обработка. Вы должны 
убедиться, что временная квота табличного пространства достаточно для хранения 
этих временных больших объектов для вашего приложения. Примечание: значения настроек 
NLS_COMP и NLS_SORT определяют правила сравнения и сортировки символов сответственно.
Если NLS_COMP установлен в наборе LINGUISTIC для вашей базы данных, тогда все 
объекты будет интерпретироваться в соответствии с правилами, установленными
параметрами NLS_SORT. Если NLS_COMP не установлен в LINGUISTIC, то функции 
интерпретируются независимо от настройки NLS_SORT. NLS_SORT может быть установлен 
вручную. Если он не установлен врунчную, то берется из NLS_LANGUAGE. Обратитесь 
к справочнику "Oracle Database Globalization Support Guide" для получения 
большей информации об этих настройках.

* Однорядные функции.
    Однорядные функции возвращают один результат-строку для каждой строки таблицы
или вью. Эти функции могут использоваться в SELECTWHERESTART WITHCONNECT BY
и HAVING.
    
    - Числовые фукнции
    В числовых функциях принимаются и возвращаются числовые значения. Числовые функции
возвращают значение типа NUMBER с точностью 38 знаков после запятой. Трансцендентные
функции COSCOSHEXPLNLOGSINSINHSQRTTAN, и TANH имеют точность 36 знаков
после запятой. Трансцендентные функции ACOSASINATAN и ATAN2 имеют точность 30 
знаков после запятой. К числовым функциям относятся:
ABS
ACOS
ASIN
ATAN
ATAN2
BITAND
CEIL
COS
COSH
EXP
FLOOR
LN
LOG
MOD
NANVL
POWER
REMAINDER
ROUND (number)
SIGN
SIN
SINH
SQRT
TAN
TANH
TRUNC (number)
WIDTH_BUCKET

    - Символьные функции, возвращающие символьные значения
    Символьные функции, возвращающие символьные значения, возвращают значения 
следующих типов, если не указано иное:
* если аргументы типа CHAR или VARCHAR2, тогда возвращается VARCHAR2.
* если аргументы типа NCHAR или NVARCHAR2, тогда возвращается NVARCHAR2.
    Длина возвращаемого функцией значения ограничена длиной типа данных, которое
возвращается.
* Для функций возвращающих CHAR или VARCHAR2, если длина превышает лимит, то Oracle
обрезает лишнее и возвращается результат без отображения ошибки.
* Для функций, возвращающих CLOB значения, при превышении лимита длины Oracle выдаст
ошибку и не вернет данные.
    К символьным функциям, возвращающим символьные значения, относятся:
CHR
CONCAT
INITCAP
LOWER
LPAD
LTRIM
NCHR
NLS_INITCAP
NLS_LOWER
NLS_UPPER
NLSSORT
REGEXP_REPLACE
REGEXP_SUBSTR
REPLACE
RPAD
RTRIM
SOUNDEX
SUBSTR
TRANSLATE
TRANSLATE ... USING
TRIM
UPPER

    - Символьные функции, возвращающие числовые значения
    Символьные функции, возвращающие числовые значения, могут принимать аргументы
с любыми символьными типами данных.
    К символьным функциям, возвращающим числовые значения, относятся:
ASCII
INSTR
LENGTH
REGEXP_COUNT
REGEXP_INSTR

    - Функции для работы с набором символов
    Функции для работы с набором символов возвращают информацию о наборе символов.
    К этим функциям относятся:
NLS_CHARSET_DECL_LEN
NLS_CHARSET_ID
NLS_CHARSET_NAME

    - Функции для работы с датами
    Функции для работы с датами взаимодействуют со значениями дат (DATE), моментов 
времени (TIMESTAMPTIMESTAMP WITH TIME ZONE, and TIMESTAMP WITH LOCAL TIME ZONE) и 
интервалов (INTERVAL DAY TO SECONDINTERVAL YEAR TO MONTH).
    Некоторые функции дат создавались для Ораклового типа DATE (ADD_MONTHS,
CURRENT_DATELAST_DAYNEW_TIME и NEXT_DAY). Если вы передадите аргумент с типом 
TIMESTAMP, то Oracle преобразует его в тип DATE и вернет значение с типом DATE.
Исключениями являются функции MONTHS_BETWEEN, которая возвращает NUMBER, а также
функции ROUND и TRUNC, которые не принимают на входе TIMESTAMP или INTERVAL значения.
Оставшиеся функции дат созданы для приема любых их треж типов дат (DATETIMESTAMP,
INTERVAL) и возвращают значение одного из этих типов.
    Все функции дат, возвращающие системную дату, такие как SYSDATESYSTIMESTAMP,
CURRENT_TIMESTAMP и т.д. выполняются один раз для каждого SQL оператора, независимо
от того, сколько раз на них ссылается этот оператор.
    К функциям дат относятся:
ADD_MONTHS
CURRENT_DATE
CURRENT_TIMESTAMP
DBTIMEZONE
EXTRACT (datetime)
FROM_TZ
LAST_DAY
LOCALTIMESTAMP
MONTHS_BETWEEN
NEW_TIME
NEXT_DAY
NUMTODSINTERVAL
NUMTOYMINTERVAL
ORA_DST_AFFECTED
ORA_DST_CONVERT
ORA_DST_ERROR
ROUND (date)
SESSIONTIMEZONE
SYS_EXTRACT_UTC
SYSDATE
SYSTIMESTAMP
TO_CHAR (datetime)
TO_DSINTERVAL
TO_TIMESTAMP
TO_TIMESTAMP_TZ
TO_YMINTERVAL
TRUNC (date)
TZ_OFFSET

    - Основные функции сравнения
    Функции сравнения вычисляют наибольшее и/или наименьшее значение из совокупности
значений.
    К основным фукнциям сравнения относятся:
GREATEST
LEAST

    - Функции преобразования
    Функции преобразования перобразуют значение из одного типа данных в другой.
Как правило, форма функции подразумевает под собой конструкцию DATATYPE TO DATATYPE.
Первый тип данных, это входящий тип. Второй тип данных, это возвращаемый тип.
    К функциям преобразования относятся:
ASCIISTR
BIN_TO_NUM
CAST
CHARTOROWID
COMPOSE
CONVERT
DECOMPOSE
HEXTORAW
NUMTODSINTERVAL
NUMTOYMINTERVAL
RAWTOHEX
RAWTONHEX
ROWIDTOCHAR
ROWIDTONCHAR
SCN_TO_TIMESTAMP
TIMESTAMP_TO_SCN
TO_BINARY_DOUBLE
TO_BINARY_FLOAT
TO_BLOB
TO_CHAR (character)
TO_CHAR (datetime)
TO_CHAR (number)
TO_CLOB
TO_DATE
TO_DSINTERVAL
TO_LOB
TO_MULTI_BYTE
TO_NCHAR (character)
TO_NCHAR (datetime)
TO_NCHAR (number)
TO_NCLOB
TO_NUMBER
TO_SINGLE_BYTE
TO_TIMESTAMP
TO_TIMESTAMP_TZ
TO_YMINTERVAL
TREAT
UNISTR

    - Функции для LOB объектов
    Функции больших объектов (LOB) работают с большими объектами.
    К функциям для LOB объектов относятся:
BFILENAME
EMPTY_BLOBEMPTY_CLOB

    - Функции коллекции
    Функции коллекции работают с вложенными таблицами и массивами.
    К функциям коллекции относятся:
CARDINALITY
COLLECT
POWERMULTISET
POWERMULTISET_BY_CARDINALITY
SET

    - Функции для работы с иерархией
    Функции для работы с иерархией применяют иерархичность к результирующему набору.
    К Функциям для работы с иерархией относятся:
SYS_CONNECT_BY_PATH

    - Функции для анализа данных
    Функции для анализа данных используются в "Oracle Data Mining" для оценки данных.
Функции могут использовать аналитическую модель данных объекта схемы или могут
динамически добывать данные путем выполнения аналитического оператора.
    К функциям для анализа данных относятся:
CLUSTER_DETAILS
CLUSTER_DISTANCE
CLUSTER_ID
CLUSTER_PROBABILITY
CLUSTER_SET
FEATURE_DETAILS
FEATURE_ID
FEATURE_SET
FEATURE_VALUE
PREDICTION
PREDICTION_BOUNDS
PREDICTION_COST
PREDICTION_DETAILS
PREDICTION_PROBABILITY
PREDICTION_SET
    Смотрите также:
    "Oracle Data Mining User's Guide" в части информации об оценке данных.
    "Oracle Data Mining Concepts" для изучения "Oracle Data Mining".

    - Функции XML
    XML функции используют или возвращают XML документы или фрагменты. Эти функции 
используют аргументы, которые не определены в стандартах ANSI/ISO/IEC SQL, но 
определены в стандартах World Wide Web Consortium (W3C). Работа и операции функций
определяются в W3C стандартах. В списке ниже приведена ссылка на соответствующий 
раздел W3C стандарта с правилами и руководствами, которые применяются к каждому из 
этих связанных с XML аргументам.
    Применение SQL операторов, использующих эти XML функции, где любой из аргументов 
не соответствует синтаксису W3C, приведет к ошибке.
    Отметим, что не каждый символ, который допускается использовать в значении 
колонки базы данных, считается допустимым в XML.
    Элемент синтаксиса - W3C ссылка:
"value_expr"       http://www.w3.org/TR/2006/REC-xml-20060816
"Xpath_string"     http://www.w3.org/TR/1999/REC-xpath-19991116
"XQuery_string"    http://www.w3.org/TR/2007/REC-xquery-semantics-20070123/
                   http://www.w3.org/TR/xquery-update-10/
"namespace_string" http://www.w3.org/TR/2006/REC-xml-names-20060816/
"identifier"       http://www.w3.org/TR/2006/REC-xml-20060816/#NT-Nmtoken
    Больше информации о выборе и использовании запросов с XML данными, используя эти
функции, включая информацию о форматировании результатов функции, см. в "Oracle XML DB
Developer's Guide".
    К функциям XML относятся:
APPENDCHILDXML
DELETEXML
DEPTH
EXISTSNODE
EXTRACT (XML)
EXTRACTVALUE
INSERTCHILDXML
INSERTCHILDXMLAFTER
INSERTCHILDXMLBEFORE
INSERTXMLAFTER
INSERTXMLBEFORE
PATH
SYS_DBURIGEN
SYS_XMLAGG
SYS_XMLGEN
UPDATEXML
XMLAGG
XMLCAST
XMLCDATA
XMLCOLATTVAL
XMLCOMMENT
XMLCONCAT
XMLDIFF
XMLELEMENT
XMLEXISTS
XMLFOREST
XMLISVALID
XMLPARSE
XMLPATCH
XMLPI
XMLQUERY
XMLROOT
XMLSEQUENCE
XMLSERIALIZE
XMLTABLE
XMLTRANSFORM    

    - Функции JSON
    "The JavaScript Object Notation (JSON)" возвращают значения из данных JSON.
    К функциям JSON относятся:
JSON_QUERY
JSON_TABLE
JSON_VALUE    

    - Функции кодирования и декодирования    
    Функции кодирования и декодирования позволяют проверять и декодировать данные в
базе данных.
    К функциям кодирования и декодирования относятся:
DECODE
DUMP
ORA_HASH
STANDARD_HASH
VSIZE

    - Функции для работы с NULL-взаимосвязанными данными
    Фукнции для рабооты с NULL значениями облегчают обработку NULL значений.
    К функциям для работы с NULL-взаимосвязанными данными:
COALESCE
LNNVL
NANVL
NULLIF
NVL
NVL2
    
    - Функции окружения (среды) и идентификатора
    Функции окружения (среды) и идентификатора обеспечивают информацией об экземпляре
и сессии. 
    К функциям окружения (среды) и идентификатора относятся:
CON_DBID_TO_ID
CON_GUID_TO_ID
CON_NAME_TO_ID
CON_UID_TO_ID
ORA_INVOKING_USER
ORA_INVOKING_USERID
SYS_CONTEXT
SYS_GUID
SYS_TYPEID
UID
USER
USERENV

* Агрегатные функции
    Агрегатные функции возвращают однострочный результат, основанный на группе строк,
а не на одной строке. Агрегатные функции могут использоваться в конструкции SELECT 
и в операторах ORDER BY и HAVING. Они обычно использутся с оператором GROUP BY в 
конструкции SELECT, где Oracle разделяет строки запрашиваемой таблицы или вью на 
группы. В запросе, содержащем оператор GROUP BY, элементы в конструкции SELECT 
могут быть агрегированы функциями, GROUP BY выражениями, константами или выражениями,
включающими одно из перечисленных. Oracle применяет агрегатные функции к каждой группе
строк и возвращает однострочный результат для каждой группы.
    Если вы не укажите оператор GROUP BY, тогда Oracle применит агрегатные функции
ко всем строкам конструкции SELECT в запрашиваемой таблице или вью. 
    В выходных данных, образуемых агрегатными функцими, можно использовать оператор
HAVING для дополнительного отбора значений в образованных группах.
    Большинство (но не все) агрегатных функций, которые имеют один аргумент, 
используют следующие операторы:
    * DISTINCT и UNIQUE, являющиеся сининомами, позволяют агрегатной функции 
возвращать только неповторяющиеся значения.
    * ALL (используется по-умолчанию) оператор заставляет функцию возвращать все 
значения, в тои числе дубликаты.
    Например, с использованием DISTINCT среднее значение для совокупности 1, 1, 1 и 3
равно 2. Но с оператором ALL среднее значение будет 1,5.
    Некоторые агрегатные функции включают оконные операторы, которые являются частью
синтаксиса аналитических функций. Такие функции будут в нижеприведенном списке
отмечены звездочкой (*).
    Все агрегатные функции, кроме COUNT(*), GROUPING и GROUPING_ID игнорируют NULL.
Вы можете использовать функцию NVL для аргумента агрегатной функции, чтобы подменить
значение NULLCOUNT и REGR_COUNT никогда не возвращают значение NULL, но
возвращают либо число, либо 0. Для всех остальных агрегатных функций, если набор 
данных не содержит строк или содержит только строки с нулями в качестве аргументов
функции, тогда функция возвращает значение NULL.
    Агрегатные функции MINMAXSUMAVGCOUNTVARIANCE и STDDEV, сопровождающиеся
ключевым словом KEEP, могут использоваться с FIRST и LAST функциями для ранжирования
набора данных, т.е. отсортировать первым или последним.
    Допустимо вложение агрегатных функций в другие функции. В следующем примере
вычисляется среднее арифметическое максимальных зарплат служащих по отделам:
SELECT AVG(MAX(SALARY))
    FROM EMPLOYEES
        GROUP BY DEPARTMENT_ID;
В этом запросе вычислится макс. зарплата в каждой группе-отделе и затем
рассчитается среднее арифметическое уже для совокупности макс. значений.
    К агрегатным функциям относятся:
APPROX_COUNT_DISTINCT
AVG
COLLECT
CORR
CORR_*
COUNT
COVAR_POP
COVAR_SAMP
CUME_DIST
DENSE_RANK
FIRST
GROUP_ID
GROUPING
GROUPING_ID
LAST
LISTAGG
MAX
MEDIAN
MIN
PERCENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC
RANK
REGR_ (Linear Regression) Functions
STATS_BINOMIAL_TEST
STATS_CROSSTAB
STATS_F_TEST
STATS_KS_TEST
STATS_MODE
STATS_MW_TEST
STATS_ONE_WAY_ANOVA
STATS_T_TEST_*
STATS_WSR_TEST
STDDEV
STDDEV_POP
STDDEV_SAMP
SUM
SYS_OP_ZONE_ID
SYS_XMLAGG
VAR_POP
VAR_SAMP
VARIANCE
XMLAGG
    
* Аналитические функции
    Аналитические функции вычисляют совокупное (агрегатное) значение на основе
группы строк. Они отличаются от агрегатных функций тем, что возвращают совокупность
строк для каждой группы. Группа возвращаемых строк называется окном и определяется 
аналитическим оператором. Для каждой строки определяется свое окно строк. Окно
определяет диапазон строк, которые будут участвовать в расчетах для текущей строки.
Размеры окна основываются на физическом номере строки или на логическом интервале,
таком как время.
    Аналитические функции выполняются последними в запросе и лишь только оператор
ORDER BY выполняется самым последним. Все соединения и операторы WHEREGROUP BY,
HAVING выполняются до выполнения аналитических функций. Пожтому аналитические функции
могут появляться только в конструкции SELECT или операторе ORDER BY.
    К аналитическим фукнциям относятся (функции отмеченные звездочкой (*) могут
включать оконный_оператор):
AVG *
CLUSTER_DETAILS
CLUSTER_DISTANCE
CLUSTER_ID
CLUSTER_PROBABILITY
CLUSTER_SET
CORR *
COUNT *
COVAR_POP *
COVAR_SAMP *
CUME_DIST
DENSE_RANK
FEATURE_DETAILS
FEATURE_ID
FEATURE_SET
FEATURE_VALUE
FIRST
FIRST_VALUE *
LAG
LAST
LAST_VALUE *
LEAD
LISTAGG
MAX *
MEDIAN
MIN *
NTH_VALUE *
NTILE
PERCENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC
PREDICTION
PREDICTION_COST
PREDICTION_DETAILS
PREDICTION_PROBABILITY
PREDICTION_SET
RANK
RATIO_TO_REPORT
REGR_ (Linear Regression) Functions *
ROW_NUMBER
STDDEV *
STDDEV_POP *
STDDEV_SAMP *
SUM *
VAR_POP *
VAR_SAMP *
VARIANCE *
    Дополнительную информацию по этим функциям можно получить в "Oracle Database 
Data Warehousing Guide".

* Функции ссылки на объект
    Функции ссылки на объект управляют значениями REF, которые являются ссылками
на объекты определенных типов.
    К функциям ссылки на объект относятся:
DEREF
MAKE_REF
REF
REFTOHEX
VALUE
    Дополнительную информацию по этим функциям можно получить в "Oracle Database 
Data Warehousing Guide".

* Функции MODEL
    Функции MODEL могут быть использованы только в операторе model в конструкции 
SELECT.
    К функциям MODEL относятся:
CV
ITERATION_NUMBER
PRESENTNNV
PRESENTV
PREVIOUS    

* Функции OLAP
    OLAP функции возвращают данные из многомерного объекта в двумерный реляционный
формат. 
    К функциям OLAP относятся:
CUBE_TABLE

* Функции картриджа данных
    Функции картриджа данных используются для разработчиков картриджей данных.
    К функциям картриджа данных относятся:
DATAOBJ_TO_MAT_PARTITION
DATAOBJ_TO_PARTITION

    Далее в алфавитном порядке перечислены все вышеупомянутые функции:
1. ABS
Синтаксис:
    ABS(X)
Назначение:
    ABS возвращает абсолютное значение аргумента "X", т.е. его модуль. Эта функция
    принимает любой числовой тип данных или любой нечисловой тип, который можно 
    неявно преобразовать в числовой тип. Функция возвращает тот же числовой тип 
    данных, что и у аргумента. 
Пример:
    1.1. Следующий запрос вернет абсолютное значение чисел: -1; 0; 2
    SELECT ABS(-1) "Absolute -1",
           ABS(0) "Absolute 0",
           ABS(2) "Absolute 2"
        FROM DUAL

2. ACOS
Синтаксис:
    ACOS(X)
Назначение:
    ACOS возвращает арккосинус аргумента X. X должен быть в диапазоне [-1;1] и 
    функция    возвращает значение в дивапазоне от 0 до числа Пи, выраженное в радианах.
    Эта функция принимает любой числовой тип данных или любой нечисловой тип, который
    можно неявно преобразовать в числовой тип. Если аргумент типа BINARY_FLOAT, тогда
    функция вернет тип BINARY_DOUBLE. В остальных случаях функция вернет тот же 
    числовой тип данных, что и у аргумента.
Пример:
    2.1. Следующий запрос вернет арккосинус для значений: -1; -0.2; 0; 0,3; 1
    SELECT ACOS(-1),
           ACOS(-0.2),
           ACOS(0),
           ACOS(0.3),
           ACOS(1)
        FROM DUAL
    
3. ADD_MONTHS
Синтаксис:
    ADD_MONTHS(DATE_, INTEGER_)
Назначение:
    ADD_MONTHS возвращает дату (DATE_) плюс (минус) количество месяцев (INTEGER). 
    Месяц определяется в соответствии с параметрами сессии NLS_CALENDAR. Аргумент DATE_ 
    может иметь значение с типом DATE или другое значение, которое можно
    неявно преобразовать в дату. Аргумент INTEGER_ может быть типа INTEGER или иметь
    другое значение, которое можно неявно преобразовать в INTEGER. Возвращается
    всегда тип DATE, незавивимо от типа данных аргумента DATE_. Если аргумент DATE_
    - это последний день месяца или в полученном месяце меньше дней, чем в месяце 
    аргумента, то возвращается последний день месяца. Иначе возвращается день, 
    аналогичный дню в аргументе DATE_.
Пример:
    3.1. Следующий запрос вернет различные даты.
    SELECT ADD_MONTHSTO_DATE('2019.02.28','YYYY.MM.DD'), 3),
           ADD_MONTHSTO_DATE('2019.02.28','YYYY.MM.DD'), -3),
           ADD_MONTHSTO_DATE('2019.02.28','YYYY.MM.DD'), 0),
           ADD_MONTHSTO_DATE('2019.02.28','YYYY.MM.DD'), 0.1),
           ADD_MONTHSTO_DATE('2019.02.28','YYYY.MM.DD'), 0.9),
           /* следующая строка для американских настроек NLS */
           ADD_MONTHS('28-FEB-2019', 3),
           /* следующая строка для русских настроек NLS */
           ADD_MONTHS('28 ФЕВ 2019', 3)
        FROM DUAL 

4. APPENDCHILDXML
    Функция APPENDCHILDXML устарела. Она все еще поддерживается для обратной 
    совместимости. Однако Oracle рекомендует использовать вместо нее XQuery Update.
    Смотрите "Oracle XML DB Developer's Guide" для получения дополнительной информации.
Синтаксис:
    APPENDCHILDXML(XMLType_Instance, XPath_string, value_expr)
    APPENDCHILDXML(XMLType_Instance, XPath_string, value_expr, namespace_string)
Назначение:
    APPENDCHILDXML добавляет пользовательское значение в целевой XML, как дочерний
    элемент узла, указанного выражением XPath.
    * XMLType_Instance это экземпляр XMLTYPE.
    * XPath_string это Xpath выражение указывающее один или несколько узлов, к которым
    должны быть добавлены один или несколько дочерних узлов. Вы можете указать 
    абсолютный путь "XPath_string" используя слэш "/" или относительный путь 
    "XPath_string", пропустив использовение слэша. Если вы пропустите слэш, то 
    относительным путем    по-умолчанию будет корневой узел.
    * value_expr указывает один или несколько узлов XMLTYPE. Он должен быть представлен
    строкой, обернутой в XMLTYPE.
    * Необязательный аргумент namespace_string предоставляет информацию о пространстве
    имен для XPath_string. Этот параметр должен иметь тип VARCHAR2.
    Смотрите "Oracle XML DB Developer's Guide" для получения информации об этой
    функции.
Пример:
    4.1. 
    /* 1) Создадим таблицу */
    CREATE TABLE TAB1 (COL1 NUMBER,
                       COL2 VARCHAR2(100),
                       COL3 XMLTYPE);
    /* 2) Вставим значения */
    INSERT INTO TAB1 VALUES (1,
                             'wrh1',
                             XMLTYPE('
                                          
                                              Jhon
                                                                                
                                      '));
    INSERT INTO TAB1 VALUES (2,
                             'wrh2',
                             XMLTYPE('
                                          
                                              Denis
                                                                                
                                      '));                                  
    COMMIT;
    -- 3) Добавим узел 25 в таблицу в w_name в w_emp, который назовем 
    -- "age", для работника Leo.
    UPDATE TAB1
        SET COL3 =  APPENDCHILDXML(COL3, 
                                   '/warehouses/w_name/w_emp',
                                   XMLTYPE('25'))
            WHERE EXTRACTVALUE(COL3,
                               '/warehouses/w_name/w_emp') = 'Denis';
    COMMIT;
    -- 4) Проверим результат, причем отфильтруем по наличию нового узла
    SELECT COL1,
           COL2,
           EXTRACTVALUE(COL3, '/warehouses/w_name/w_emp/age') "AGE"
        FROM TAB1
            WHERE EXISTSNODE(COL3, '/warehouses/w_name/w_emp/age') = 1
    -- 5) вставим третью строку
    INSERT INTO TAB1 VALUES (3,
                             'wrh3',
                             XMLTYPE('
                                          
                                              row3
                                              Ashley
                                              Greg
                                              Bob
                                                                                
                                      '));
    COMMIT;
    -- 6) добавим узел для каждого узла w_emp, где есть row3
    UPDATE TAB1
        SET COL3 = APPENDCHILDXML(COL3,
                                  '/warehouses/w_name/w_emp',
                                  XMLTYPE('30'))
            WHERE EXTRACTVALUE(COL3,
                               '/warehouses/w_name/title') = 'row3';
    COMMIT;
    -- 7) вручную проверим результат в третьей строке
    SELECT *
        FROM TAB1

5. APPROX_COUNT_DISTINCT
    Данная функция доступна начиная с версии "Oracle Database 12c Release 1 (12.1.0.2)"
Синтаксис:
    APPROX_COUNT_DISTINCT(EXPR)
Назначение:
    APPROX_COUNT_DISTINCT возвращает приблизительное число уникальных строк в колонке. 
    Эта фукнция является альтернативой функции COUNT(DISTINCT EXPR), возвращающей
    точное количество уникальных строк. APPROX_COUNT_DISTINCT работает с большими 
    наборами данных гораздо быстрее, чем COUNT с DISTINCT, с незначительным отклонением 
    от точного результата.
    В качестве аргумента EXPR можно указать любую колонку с любым скалярным типом
    данных, кроме BFILE, BLOBCLOBLONGLONG RAW или NCLOB.
    APPROX_COUNT_DISTINCT игнорирует строки, содержащие NULL. Эта функция возвращает
    число. 
Пример:
    5.1.
    /* 1) Создадим таблицу с двумя колонками, чтобы наполнить ее 500 000 строк */
    CREATE TABLE TAB1 (COL1 VARCHAR2(10),
                       COL2 NUMBER);
    -- 2) Наполним таблицу строками, в первой колонке будет значение "group1",
    -- а во второй колонке числа от 1 до 150 000.
    -- Далее добавим еще строки, где в первой колонке будет значение "group2", а
    -- во второй колонке числа от 150 001 до 500 000.
    BEGIN
        FOR i IN 1 .. 150000 LOOP
            EXECUTE IMMEDIATE 'INSERT INTO TAB1 VALUES(''group1'',''group1'|| i ||''')';
        END LOOP;
        FOR i IN 150001 .. 500000 LOOP
            EXECUTE IMMEDIATE 'INSERT INTO TAB1 VALUES(''group2'',''group2'|| i ||''')';
        END LOOP;
        COMMIT;
    END;
    /* 3) Напишем запрос, считающий приблизительное количество строк в колонке COL2 */
    SELECT APPROX_COUNT_DISTINCT(COL2)
        FROM TAB1
    /* 4) Напишем запрос с COUNT(DISTINCT...), чтобы посмотреть различие в скорости */
    SELECT COUNT(DISTINCT COL2)
        FROM TAB1
    /* 5) Изменим запрос, посчитав количество для групп из колонки COL1 */
    SELECT COL1,
           APPROX_COUNT_DISTINCT(COL2)
        FROM TAB1
            GROUP BY COL1
                ORDER BY COL1
    /* 6) Поменяем на COUNT(DISTINCT...), чтобы посмотреть различие в скорости */
    SELECT COL1,
           COUNT(DISTINCT COL2)
        FROM TAB1
            GROUP BY COL1
                ORDER BY COL1

6. ASCII
Синтаксис:
    ASCII(CHAR_)
Назначение:
    ASCII возвращает первый символ аргумента CHAR_ в виде десятичной цифры, которую
    берет из набора символов базы данных кодировки ASCII.
    Аргумент CHAR_ может иметь типы CHARVARCHAR2NCHAR или NVARCHAR2. Возвращаемое
    значение - число. Если для вашей базы данных установлен 7-битный набор символов
    ASCII, то эта функция возвращает значение из кодировки ASCII. Если набор символов
    вашей базы относится к EBCDIC кодировке, тогда функция вернет EBCDIC значение.
    Отдельной фукнции, работающей с символами EBCDIC нет.
    Данная функция не поддерживает CLOB данные напрямую. Тем не менее, CLOB могут 
    быть переданы в качестве аргументов через неявное преобразование данных.
Пример:
    6.1. 
    /* 1) Создадим таблицу и заполним ее строковыми значениями */
    CREATE TABLE TAB1 (COL_CHAR      CHAR(10),
                       COL_VARCHAR2  VARCHAR2(10),
                       COL_NCHAR     NCHAR(10),
                       COL_NVARCHAR2 NVARCHAR2(10));
    INSERT INTO TAB1 VALUES ('first',
                             'first',
                             'first',
                             'first');
    /* 2) Напишем запрос с функцией, чтобы увидеть числа */
    SELECT ASCII('F'),
           ASCII(COL_CHAR),
           ASCII(COL_VARCHAR2),
           ASCII(COL_NCHAR),
           ASCII(COL_NVARCHAR2)
        FROM TAB1
    /* 3) Можно свериться с таблицей http://www.asciitable.com/ */

7. ASCIISTR
Синтаксис:
    ASCIISTR(CHAR_)
Назначение:
    ASCIISTR принимает в качестве аргумента строку или выражение, которое преобразуется
    в строку или в любой набор символов и возвращает ASCII-версию строки, согласно
    установкам кодировки в базе данных. Символы не поддерживаемые в ASСII преобразуются
    в форму "\xxxx", где xxxx представляют собой эелементы кодировки UTF-16.
        Смотрите также "Oracle Database Globalization Support Guide" для получения
    большей информации об символах Юникода и о семантике символов.
Пример:
    7.1.
    /* Следующий запрос вернет строку соответствующую ASCII  */
    SELECT ASCIISTR('ABÄCDE'),
           ASCIISTR('Hello!')
        FROM DUAL

8. ASIN
Синтаксис:
    ASIN(X)
Назначение:
    ASIN возвращает арксинус аргумента X. X должен быть в диапазоне [-1;1]. Функция
    возвращает в виде результата значение, в диапазоне от -pi/2 до pi/2, в радианах.
    Эта функция принимает в качестве аргумента любые числовые типы, а также нечисловые
    типы, которые могут быть неявно преобразованы в числовой тип. Если аргумент типа
    BINARY_FLOAT, то функция вернет BINARY_DOUBLE. Во всех остальных случаях функция
    вернет такой же тип, какой и у аргумента.
Пример:
    8.1. 
    /* Следующий запрос вернет арксинус для значений: -1; -0.2; 0; 0,3; 1 */
    SELECT ASIN(-1),
           ASIN(-0.2),
           ASIN(0),
           ASIN(0.3),
           ASIN(1)
        FROM DUAL

9. ATAN 
Синтаксис:
    ATAN(X)
Назначение:
    ATAN возвращает арктангенс аргумента X. Аргумент X может быть в неограниченном 
    диапазоне и возвращает значение в диапазоне от -pi/2 до pi/2, выраженное в 
    радианах.
    Эта функция принимает в качестве аргумента числовые типы, а также нечисловые
    типы, которые могут быть неявно преобразованы в числовой тип. Если аргумент
    типа BINARY_FLOAT, то функция вернёт BINARY_DOUBLE. В остальных случаях 
    функция вернет такой числовой тип, что и у аргумента.
Пример:
    9.1. 
    /* Следующий запрос вернет арктангенс для значений: -1; -0.2; 0; 0,3; 1 */
    SELECT ATAN(-1),
           ATAN(-0.2),
           ATAN(0),
           ATAN(0.3),
           ATAN(1)
        FROM DUAL    

10. ATAN2
Синтаксис:
    ATAN2(X1, X2)
Назначение:
    ATAN2 возвращает арктангенс для заданных координат X1 и X2. Аргумент X1 может быть 
    неограниченного диапазона и возвращать значение в диапазоне от -pi до pi, в 
    зависимости от знаков X1 и X2, выраженное в радианах.
    Эта функция принимает аругменты c числовым типом, а также нечисловым типом, который
    может быть преобразован в числовой тип. Аргументы с типом BINARY_FLOAT и 
    BINARY_DOUBLE, возвращают тип BINARY_DOUBLE. Во всех остальных случаях
    возвращается тип NUMBER.
Пример:
    10.1. 
    /* Следующий запрос возвращает арктангенс 0,3 и 0,2    */
    SELECT ATAN2(0.3, 0.2)
        FROM DUAL

11. AVG
Синтаксис:
    AVG(...                  ) -> ...
        DISTINCT EXPR          OVER (аналитический_оператор)
        ALL (по-умолчанию)           
Назначение:
    Возвращает среднее значение для аргумента EXPR. 
    Эта функция принимает аргументы с любыми числовыми типами, а также любыми нечисловыми
    типами, которые могут быть преобразованы в числовой тип. Функция возвращает такой
    же числовой тип, что и у аргумента.
    Если вы указали DISTINCT, тогда вы можете указать только оператор_query_partition
    из аналитического_оператора. Оператор_ORDER_BY и оконный_оператор не разрешены.
Пример:
    11.1. Пример в виде агрегатной функции.
    /* 1) Создадим таблицу */
    CREATE TABLE TAB1 (COL1 NUMBER);
    /* 2) Наполним ее данными */
    INSERT INTO TAB1 VALUES (2);
    INSERT INTO TAB1 VALUES (3);
    INSERT INTO TAB1 VALUES (4);
    COMMIT;
    /* 3) Посчитаем среднее арифметическое для колонки COL1 */
    SELECT AVG(COL1)
        FROM TAB1
    11.2. Пример в виде аналитической функции
    /* Создадим таблицу и наполним данными */
    CREATE TABLE TAB1 (COL_ID NUMBER,
                       COL_PROD VARCHAR2(100),
                       COL_PRICE NUMBER,
                       COL_DATE DATE);
    INSERT INTO TAB1 VALUES (1, 'prod1', 10, TO_DATE('02.02.2019','DD.MM.YYYY'));
    INSERT INTO TAB1 VALUES (2, 'prod1', 20, TO_DATE('03.02.2019','DD.MM.YYYY'));
    INSERT INTO TAB1 VALUES (3, 'prod1', 30, TO_DATE('03.02.2019','DD.MM.YYYY'));    
    INSERT INTO TAB1 VALUES (4, 'prod2', 20, TO_DATE('06.02.2019','DD.MM.YYYY'));
    INSERT INTO TAB1 VALUES (5, 'prod2', 20, TO_DATE('05.02.2019','DD.MM.YYYY'));
    INSERT INTO TAB1 VALUES (6, 'prod2', 40, TO_DATE('04.02.2019','DD.MM.YYYY'));
    INSERT INTO TAB1 VALUES (7, 'prod2', 50, TO_DATE('07.02.2019','DD.MM.YYYY'));
    INSERT INTO TAB1 VALUES (8, 'prod3', 10, TO_DATE('08.02.2019','DD.MM.YYYY'));
    INSERT INTO TAB1 VALUES (9, 'prod3', 20, TO_DATE('07.02.2019','DD.MM.YYYY'));
    INSERT INTO TAB1 VALUES (10, 'prod3', 60, TO_DATE('09.02.2019','DD.MM.YYYY'));
    COMMIT;
    /* 1) Напишем запрос, выводящий среднее арифметическое для колонки COL_PRICE */
    SELECT COL_ID,
           COL_PROD,
           COL_PRICE,
           COL_DATE,
           AVG(COL_PRICE) OVER(PARTITION BY COL_PROD) AS MY_AVG
        FROM TAB1
            ORDER BY COL_PROD,
                     COL_DATE
    -- 2) Напишем запрос, с выводом среднего арифметического значения для колонки 
    -- COL_PRICE с учетом "накопления" дат по-возрастанию в группе COL_PROD
    SELECT COL_ID,
       COL_PROD,
       COL_PRICE,
       COL_DATE,
       AVG(COL_PRICE) OVER(PARTITION BY COL_PROD ORDER BY COL_DATE
           ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS MY_AVG
    FROM TAB1
        ORDER BY COL_PROD
    -- 3) Напишем запрос, с выводом среднего арифметического значения для колонки 
    -- COL_PRICE с сортировкой даты по-возрастанию в группе COL_PROD, но с выбором
    -- строк в пределах группы в указанном диапазоне (ROWS BETWEEN), например: 
    -- будем брать диапазон от одной предшествующей строки (1 PRECEDING) перед текущей 
    -- строкой до одной следующей строки (1 FOLLOWING) после текущей строки.
    SELECT COL_ID,
       COL_PROD,
       COL_PRICE,
       COL_DATE,
       AVG(COL_PRICE) OVER(PARTITION BY COL_PROD ORDER BY COL_DATE
           ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS MY_AVG
    FROM TAB1
        ORDER BY COL_PROD
    
12. BFILENAME
Синтаксис:
    BFILENAME('директория', 'имя_файла')
Назначение:
    BFILENAME возвращает локатор BFILE, связанный с физическим двоичным файлом LOB в
    файловой системе на сервере.
    'директория' - это объект базы данных, являющийся алиасом имени полного
    пути в файловой системе сервера, где файлы реально находятся.
    'имя_файла' - это имя файла в файловой системе сервера.
    Вы должны создать объект директории и связать значение BFILE с физическим
    файлом до использования их в виде агрументов функции BFILENAME в SQL или PL/SQL
    операторе, DBMS_LOB пакете или OCI операции.
    Вы можете использовать эту функцию в двух случаях:
    1) В операторе DML для инициализации столбца BFILE.
    2) В программном интерфейсе для доступа к BFILE-данным путем присвоения значения 
    BFILE-локатору.
    Аргумент 'директория' регистрозависим. Вы должны убедиться, что вы указали
    имя объекта директории в точности так, как оно существует в словаре данных.
    Например, если объект директории "Admin" с помощью оператора CREATE DIRECTORY 
    был создан с использованием смешанного регистра и идентификатора в кавычках, тогда
    при использовании функции BFILENAME надо ссылаться на объект директории, как 'Admin'.
    Вы должны указывать аргумент 'имя_файла' в соответствии с правилами пунктуации
    вашей операционной системы.
        Смотрите тажке "Oracle Database SecureFiles and Large Objects Developer's 
        Guide" и "Oracle Call Interface Programmers Guide" для большей информации
        о LOB и примерах получения BFILE-данных.
Пример:    
    11.2. 
    /* 1) Создадим директорию */
    CREATE DIRECTORY MY_DIR AS '/user/my_folder';       
    /* 2) Создадим таблицу */
    CREATE TABLE TAB1 (COL1 NUMBER,
                       COL2 BFILE);
    /* 3) Предположим, что в папке есть файл "my_file.gif". Загрузим его в таблицу */
    INSERT INTO TAB1 (COL1, COL2)
        VALUES (1, BFILENAME('MY_DIR', 'my_file.gif'));
    COMMIT;
    
13. BIN_TO_NUM
Синтаксис:
    BIN_TO_NUM(X, X1, ...)
Назначение:
    BIN_TO_NUM преобразует битовый вектор в соответствующее число. Каждый аргумент
    этой функции представляет собой бит в битовом векторе. Эта функция принимает
    в качестве аргументов любые числовые типы, а также нечисловые, которые можно
    неявно преобразовать в тип NUMBER. Каждый X, X1 и т.д. должен быть 0 или 1.
    Эта функция возвращает тип NUMBER.
    BIN_TO_NUM полезна в приложениях по работе с хранилищами данных для выбора 
    определенных групп из материализованного представления с использованием 
    групповых наборов.
Пример:
    13.1.
    Следующий пример показывает преобразование двоичного значения в число.
    SELECT BIN_TO_NUM(1, 0, 1, 0)
        FROM DUAL;
    13.2.
    Следующий пример преобразует три значения в одно бинарное значение и использует
    BIN_TO_NUM для преобразования бинарного значения в число. Пример использует PL/SQL
    блок для создания значений. Но обычно значения можно взять из готовых источников.
    /* 1) Создадим таблицу  */
    CREATE TABLE TAB1 (COL1 NUMBER, COL2 NUMBER);
    /* 2) Вставим данные в COL2  */
    INSERT INTO TAB1 (COL2) VALUES (111);
    /* 3) Создадим последовательность, преобразуем её в число и изменим COL1 на число*/
    DECLARE
        x NUMBER := 1;
        y NUMBER := 1;
        z NUMBER := 1;
        res NUMBER;
    BEGIN
        SELECT BIN_TO_NUM(x, y, z) INTO res 
            FROM DUAL;
        UPDATE TAB1
            SET COL1 = res
                WHERE COL2 = 111;
    END;
    /* 4) Проверим что получилось */
    SELECT COL1,
           COL2
        FROM TAB1
    Также посмотрите примеры в функции BITAND для понимания процесса извлечения
    нескольких значений из одного значения колонки.
    
14. BITAND
Синтаксис:
    BITAND(X, Y)
Назначение:
    BITAND обрабатывает X и Y как векторы битов, результатом функции является
    побитовое И для X и Y. Типы X и Y должны быть NUMBER и результат функции также 
    будет NUMBER. Если X и Y будут NULL, то результат тоже NULL.
    X и Y должны быть в диапазоне -(2в_степени(n-1))..((2в_степени(n-1)) -1). 
    Если X или Y будут вне этого диапазона, то результат будет неопределен.
    Результат вычисляется в несколько шагов. Во-первых, каждый аргумент заменяется
    значением SIGN(X)*FLOOR(ABS(X)). Это преобразование имеет эффект усечения 
    каждого аргумента до 0. Далее, аргументы (которые должны быть целыми значениеми) 
    преобразуются в два сочетаемых n-битовых двоичных значения. Эти два двоичных
    значения комбинируются с помощью побитовой операции И. В результате, соединенное
    из двух, n-битовое значение преобразуется в NUMBER.
    Замечания по BITAND функции:
    * текущая реализация BITAND функции подразумевает, что n = 128.
    * PL/SQL поддерживает перегрузку для BITAND для которой типы на входе и результат
    представлены BINARY_INTEGER и для которого n = 32.
Примеры:
    14.1.
    -- Следующий пример выполняет операцию И для чисел 6(бинарное 1,1,0) и 3(бинарное 
    -- 0,1,1): */
    SELECT BITAND(6, 3)
        FROM DUAL
    14.2.
    -- Следующий пример аналогичный предыдущему выполняет ту же самую операцию для 6 и 3.
    -- BITAND функция оперирует только цифрами бинарных значений, т.е. 0 и 1.
    SELECT BITAND(BIN_TO_NUM(1,1,0),
                  BIN_TO_NUM(0,1,1)) "BINARY"
        FROM DUAL
    14.3.
    -- Следующий пример показывает, как еще можно использовать функцию, зная о том, 
    -- что функция выполняет операцию побитового И. Например BITAND(1,1) выдаст 1.
    -- 1) Создадим таблицу товаров со статусами 1, 2, 3. Пусть эти статусы будут
    -- означать: 1 - поступил на склад, 2 - зарезервирован покупателем, 3 - продан.
    -- И вставим данные в эту таблицу.
    CREATE TABLE TAB1 (PRODUCT VARCHAR2(100), 
                       STATUS NUMBER);
    INSERT INTO TAB1 (PRODUCT, 
                      STATUS) VALUES ('p0',
                                      0);                   
    INSERT INTO TAB1 (PRODUCT, 
                      STATUS) VALUES ('p1',
                                      1);
    INSERT INTO TAB1 (PRODUCT, 
                      STATUS) VALUES ('p2',
                                      4);
    INSERT INTO TAB1 (PRODUCT, 
                      STATUS) VALUES ('p3',
                                      2);    
    INSERT INTO TAB1 (PRODUCT, 
                      STATUS) VALUES ('p4',
                                      5);                                    
    INSERT INTO TAB1 (PRODUCT, 
                      STATUS) VALUES ('p5',
                                      3);                                    
    COMMIT;
    -- 2) Выполним запрос, применив DECODE и используя придуманные значения статусов.
    -- Для справки переведем числа в двоичный формат, и рассмотрим побитовое И для 1
    -- 1 = 0001 Первая строка:     1=0001 1=0001 1=0001
    --                            1=0001 2=0010 3=0011
    --                    Итог:    1=0001 0=0000 1=0001
    -- 2 = 0010 
    -- 3 = 0011
    -- 4 = 0100
    -- 5 = 0101
    -- В результате обратите внимание на строки 5 и 6.
    SELECT PRODUCT,
           STATUS,
           BITAND(STATUS, 1) || DECODE(BITAND(STATUS, 1), 1, '_IN', '_OUT'),
           BITAND(STATUS, 2) || DECODE(BITAND(STATUS, 2), 2, '_RESERVED', '_NOT RESERVED'),
           BITAND(STATUS, 3) || DECODE(BITAND(STATUS, 3), 3, '_SOLD OUT', '_NOT SOLD')
        FROM TAB1

15. CARDINALITY
Синтаксис:
    CARDINALITY(вложенная_таблица)
Значение:
    CARDINALITY возвращает чисто элементов во вложенной_таблице. Возвращается тип NUMBER.
    Если вложенная_таблица пустая или представлена NULL коллекцией, тогда CARDINALITY
    вернет NULL.
Примеры:
    15.1.
    /* Пример показывает количество элементов в переменной типа TABLE OF NUMBER */
    /* 1) Создадим тип */
    CREATE TYPE MY_NESTED_TABLE IS TABLE OF NUMBER;
    -- 2) Напишем анонимный блок, где в переменную с нашим типом внесем значения:
    -- 1, 2, 3, 4. Далее отобразим в DBMS_OUTPUT количество элементов, сравнив с COUNT
    DECLARE
        MNT MY_NESTED_TABLE := MY_NESTED_TABLE(1, 2, 3, 4);
    BEGIN 
        DBMS_OUTPUT.PUT_LINE(CARDINALITY(MNT));
        DBMS_OUTPUT.PUT_LINE(MNT.COUNT);
    END;
    
    15.2.
    /* Пример показывает примение CARDINALITY к колонке с типом вложеннная_таблица */
    /* 1) Создадим тип вложенная_таблица */
    -- удалить созданный тип можно командой DROP TYPE MY_NESTED_STRING FORCE;
    CREATE TYPE MY_NESTED_STRING IS TABLE OF VARCHAR2(100);
    -- 2) Создадим таблицу с колонкой с типом NUMBER и с колонкой с типом 
    -- вложенная_таблица, т.е. MY_NESTED_STRING
    CREATE TABLE TAB1 (COL1 NUMBER,
                       COL2 MY_NESTED_STRING)
        NESTED TABLE COL2 STORE AS COL2_NESTED;
    /* 3) Добавим в таблицу значения */
    INSERT INTO TAB1 (COl1, COL2) 
        VALUES (1, MY_NESTED_STRING('один', 'два'));
    INSERT INTO TAB1 (COl1, COl2)
        VALUES (2, MY_NESTED_STRING('четыре','пять','шесть'));
    COMMIT;
    /* 4) Выполним запрос к таблице и посмотрим результат */
    SELECT COL1,
           COL2
        FROM TAB1
    /* 5) Выполним запрос к таблице применив CARDINALITY */
    SELECT COL1,
           CARDINALITY(COL2)
        FROM TAB1
    -- 6) Используя оператор THE просмотрим элементы вложенной_таблицы именно
    -- для строки где COL2 = 2.
    SELECT VALUE(t2)
        FROM THE (SELECT COL2
                      FROM TAB1 
                          WHERE COL1 = 2) t2
    -- 7) Используя фунцию TABLE отобразим элементы в строках
    SELECT t1.*,
           t2.*
        FROM TAB1 t1,
             TABLE(t1.COL2) t2
            
16. CAST    
Синтаксис:
    CAST(X                      AS тип)
         MULTISET(подзапрос)
Значение:
    CAST преобразует один встроенный тип данных или значение типа-коллекции в другой
    встроенный тип данных или другое значение типа-коллекции.
    CAST позволяет вам преобразовывать встроенный тип данных или значение типа-коллекции
    в другой встроенный тип данных или тип-коллекцию. Вы можете преобразовывать
    неименованный операнд (такой как дата или результат подзапроса) или именованную
    коллекцию (такую как массив или вложенную таблицу) в совместимый тип данных или 
    именованную коллекцию. Имя_типа должно иметь имя встроенного типа данных или 
    типа-коллекции и операнд должен быть встроенным типом или значением коллекции.
    Например, операнд X может быть встроенного типа, типа коллекция или экземпляром
    (инстансом) типа ANYDATA. Если X является экзмепляром типа ANYDATA, тогда CAST
    попытается извлечь значение экземпляра ANYDATA и вернуть аналогичный тип, иначе,
    вернется NULL. MULTISET указывает СУБД Oracle принять результат подзапроса и вернуть
    значение коллекции. Таблица "16.t1" показывает какие встроенные типы могут быть 
    преобразованы CAST`ом в другие типы. (CAST не поддерживает LONGLONG RAW или 
    типы, поставляемые Oracle).
    
    Таблица "16.t1" Применение CAST к встроенным типам данных.
    
                    из               из       из      из        из    из         из
                    BINARY_FLOAT, CHAR,    NUMBER DATETIMERAW ROWID,     NCHAR,
                    BINARY_DOUBLE VARCHAR2          INTERVAL      UROWID     NVARCHAR2
                                                  (прим.1)        (прим.2)
                                            
    в BINARY_FLOAT,        X            X        X        -         -        -        X
      BINARY_DOUBLE
                                                    
    в CHAR,             X            X        X        X         X        X        -
      VARCHAR2
    
    в NUMBER            X            X        X        -         -        -        X
    
    в DATE,                -            X        -        X         -        -        -
      TIMESTAMP,                            
      INTERVAL
    
    в RAW                -            X        -        -         X        -        -
    
    в ROWID,             -            X        -        -         -        X        -
      UROWID
      
    в NCHAR,            X            -        X        X         X        X        X
      NVARCHAR2
    
    Прим.1: DATETIME/INTERVAL включают типы DATETIMESTAMPTIMESTAMP WITH TIME ZONE,
    INTERVAL DAY TO SECOND и INTERVAL YEAR TO MONTH.
    Прим.2: Вы не сможете преобразовать UROWID в ROWID если UROWID содержит значение
    ROWID индексно-организованной таблицы.
    
    Если вы хотите преобразовать именованный тип коллекции в другой именованный тип
    коллекции, тогда элементы обоих коллекций должны быть одинакового типа.
        См. также "Implicit Data Conversation" в "Oracle SQL Language Reference 
        12c Release 1 (12.1) E41329 25 july 2017" на стр.2-43 чтобы понять, как 
        СУБД Oracle неявно преобразует данные типа коллекции в символьные данные
        и "Security Considerations for Data Conversion" на стр.2-47.
    Если результат подзапроса может состоять из нескольких строк, тогда вам
    необходимо указать ключевое слово MULTISET. Строки, полученные из подзапроса,
    образуют элементы коллекции с типом, в который они преобразуются. Без ключевого
    слова MULTISET подзапрос рассматривается, как скалярный подзапрос.
Примеры:    
    --Примеры встроенных типов данных.
    В следующих примерах используется функция CAST со скалярными типами данных.
    Пример 16.1 преобразует текст в TIMESTAMP значение применяя форматирование
    согласно параметру сессии NLS_TIMESTAMP_FORMAT. Чтобы избежать зависимости от
    этого NLS-параметра вы можете использовать TO_DATE, как показано в примере 16.2.
    16.1.
    SELECT CAST('22-OCT-1997' AS TIMESTAMP WITH LOCAL TIME ZONE)
        FROM DUAL
    16.2.    
    --В примере 16.2 функция TO_DATE преобразует текст в DATE, и затем функция CAST
    --преобразует из DATE в TIMESTAMP WITH LOCAL TIME ZONE, отображая дату согласно
    --настройкам часового пояса нашей сессии (SESSIONTIMEZONE).
    SELECT CAST(TO_DATE('22-Oct-1997', 'DD-Mon-YYYY') AS 
               TIMESTAMP WITH LOCAL TIME ZONE)
        FROM DUAL
    16.3.
    --В примере 16.3 преобразуем число 15 в текст 
    SELECT CAST(15 AS VARCHAR2(10))
        FROM DUAL
    --Примеры с коллекциями
    16.4.
    -- В примере 16.4 выполняется преобразование результата запроса в тип коллекции.
    -- 1) Создадим таблицу в которой будет номер склада и продукты, хранящиеся 
    -- на этих складах и вставим данные.
    CREATE TABLE PROD (WRH NUMBER
                       PRODUCT VARCHAR2(100));
    INSERT INTO PROD VALUES(1, 'product1');
    INSERT INTO PROD VALUES(1, 'product2');
    INSERT INTO PROD VALUES(2, 'product3');
    INSERT INTO PROD VALUES(2, 'product4');
    INSERT INTO PROD VALUES(3, 'product5');
    COMMIT;
    -- 2) Создадим таблицу с менеджерами закрепленными за складами
    CREATE TABLE MANAGERS (WRH NUMBER,
                           MAN_NAME VARCHAR2(100));
    INSERT INTO MANAGERS VALUES(1, 'nameX');
    INSERT INTO MANAGERS VALUES(2, 'nameY');
    INSERT INTO MANAGERS VALUES(3, 'nameZ');
    COMMIT;
    -- 3) Соединим таблицы, чтобы отобразить продукты, соответствующие менеджерам
    SELECT mn.MAN_NAME,
           pr.PRODUCT
        FROM MANAGERS mn
            LEFT JOIN PROD pr
            ON mn.WRH = pr.WRH
                ORDER BY mn.MAN_NAME
    -- 4) Теперь cоздадим тип коллекции 
    CREATE TYPE MY_TYPE IS TABLE OF VARCHAR2(100);
    -- 5) Теперь сможем выполнить запрос из п.3 используя функцию CAST. То есть
    -- названия продуктов поместим в созданный тип MY_TYPE
    SELECT mn.MAN_NAME,
           CAST(MULTISET(SELECT pr.PRODUCT
                             FROM PROD pr
                                 WHERE pr.WRH = mn.WRH) AS MY_TYPE) PRODUCT
        FROM MANAGERS mn
            ORDER BY mn.MAN_NAME
            
    16.5.
    -- Пример преобразующий тип VARRAY в тип nested table, т.е., например, в 
    -- TABLE OF NUMBER        
    -- 1) Создадим два типа: VARRAY и TABLE OF NUMBER
    CREATE TYPE VAR_TYPE AS VARRAY(3) OF NUMBER;
    CREATE TYPE TAB_TYPE AS TABLE OF NUMBER;
    -- 2) Создадим таблицу, которая имеет столбец с типом VARRAY
    CREATE TABLE TAB1 (ID NUMBER,
                       COLUMN_VARRAY VAR_TYPE);
    INSERT INTO TAB1 VALUES (1, VAR_TYPE(11, 22, 33));
    INSERT INTO TAB1 VALUES (2, VAR_TYPE(44, 55, 66));
    COMMIT;
    -- 3) Преобразуем колонку COLUMN_VARRAY из типа VAR_TYPE в тип TAB_TYPE
    SELECT ID,
           CAST(COLUMN_VARRAY AS TAB_TYPE)
        FROM TAB1
            
17. CEIL    
Синтаксис:
    CEIL(X)
Значение:
    CEIL возвращает наименьшее целое, которое больше или равно X. Под числом X 
    можно понимать разницу между целым числом Y и положительной дробью F с 
    выполнением условия: 0 <= F < 1 и X = Y - F. Если X передать, как целое число,
    то результат функции будет равен X.
    Эта функция принимает в качестве аргумента любой числовой тип данных или любой
    нечисловой тип данных, который получится преобразовать в числовой тип данных.
    Функция возвращает такой же числовой тип данных, что и в аргументе.
        См. также: таблица 2-10 "Implicit Type Conversion Matrix" на стр. 2-43 в 
        "Oracle SQL Language Reference 12c Release 1 (12.1) E41329 25 july 2017" 
        для получения дополнительной информации о неявном преобразовании и функции 
        FLOOR на стр. 7-126.
Примеры:
    17.1.
    --Пример для разных чисел.
    SELECT CEIL(2.9),
           CEIL(2.1),
           CEIL(2.5),
           CEIL(-2.9),           
           CEIL(-2.1),           
           CEIL(-2.5),           
           CEIL(0),
           CEIL(100)
        FROM DUAL
    
18. CHARTOROWID    
Синтаксис:
    CHARTOROWID(X)
Значение:
    CHARTOROWID преобразует значение из типов CHARVARCHAR2NCHAR или NVARCHAR2
    в тип ROWID.
    Эта функция не поддерживает CLOB данные напрямую. Однако CLOB можно использовать
    в качестве аргумента после неявного преобразования.
        См. также "Data Type Comparison Rules" на стр. 2-39 в "Oracle SQL Language 
        Reference 12c Release 1 (12.1) E41329 25 july 2017".
Примеры:
    18.1
    --В примере создадим таблицу в базе данных, наполним ее, отразим
    --в запросе ROWID, запомним этот ROWID и попробуем найти по нему строку.
    --(в каждой базе данных ROWID будут отличаться).
    --1) Создадим таблицу и наполним ее данными
    CREATE TABLE TAB1(COL1 NUMBER);
    INSERT INTO TAB1 VALUES (100);
    INSERT INTO TAB1 VALUES (200);
    INSERT INTO TAB1 VALUES (300);
    COMMIT;
    --2) Сделаем выборку
    SELECT ROWID,
           COL1
        FROM TAB1
            ORDER BY COL1
    --3) Получили три ROWID
    AAAUenAAHAAAAEGAAA    100
    AAAUenAAHAAAAEGAAB    200
    AAAUenAAHAAAAEGAAC    300
    --4) Теперь зная ROWID для строки со значением 200 сделаем отбор этой строки
    SELECT COL1
        FROM TAB1
            WHERE ROWID = CHARTOROWID('AAAUenAAHAAAAEGAAB')
            
19. CHR
Синтаксис:
    CHR(X                 )
        X USING NCHAR_CS
Значение:
    CHR возвращает символ, либо набор символов, с типом VARCHAR2, эквивалентный числу 
    X. Если используется конструкция USING NCHAR_CS, то возвращается национальный
    набор символов.
    Для однобайтовых символов, если X > 256, тогда Oracle вернет результат, но сначала
    применит MOD(X, 256). Для многобайтовых наборов символов, X должен быть
    преобразован в десятичную систему счисления. Некорректный X приведет к 
    неопределенному результату.
    Функция принимает аргумент с типом NUMBER или любым другим типом, который неявно
    можно преобразовать к NUMBER и возвращает символ.
        Замечание: использование CHR функции (как без, так и с указанием преложения
        USING NCHAR_CS) приводит к коду, который не переносится между машинами на 
        ASCII- и EBCDIC- архитектурах.
        См. также: NCHR на стр.7-199 и таблицу 2-10 "Implicit Type Conversion Matrix"
        на стр.2-43 в "Oracle SQL Language Reference 12c Release 1 (12.1) E41329 25
        july 2017", чтобы больше узнать о неявном преобразовании.
Примеры:
    19.1
    --1) Посмотрим какая кодировка используется в базе данных на сервере.
    --В нашем сервере используется Юникод: 
    --NLS_NCHAR_CHARACTERSET (для NCHAR и NVARCHAR2) = "AL16UTF16" 
    --и NLS_CHARACTERSET (для CHAR и VARCHAR2) = "AL32UTF8"
    SELECT *
        FROM NLS_DATABASE_PARAMETERS
            WHERE PARAMETER IN ('NLS_NCHAR_CHARACTERSET',
                                'NLS_CHARACTERSET')                            
    --2) Далее посмотрим какая кодировка используется на клиенте-компьютере
    --В нашем клиенте используется AMERICAN_AMERICA.AL32UTF8, т.е UTF8 (Юникод) для 
    --амер. языка.
    SELECT USERENV('language')
        FROM DUAL    
    --3) Следует переводить число из шестнадцатеричной системы в десятичную.
    --Шестнадцатеричные значения для однобайтовых символов (первые 128 символов) 
    --в UTF-8 найдем в таблице https://en.wikipedia.org/wiki/UTF-8
    --Буква "H" в шестнадцатеричной системе = 0048‬, а в десятичной = 72
    SELECT CHR(72)
        FROM DUAL
    --4) Например слово "Hello" состоит из: H = 72, e - 101, l - 108, o - 111.
    SELECT CHR(72)||CHR(101)||CHR(108)||CHR(108)||CHR(111)
        FROM DUAL
    --5) С помощью конструкции CHR(13)||CHR(10) можно делать перенос строки.
    --Чтобы увидеть перенос следует текст из результата запроса скопировать в блокнот.
     SELECT CHR(72)||CHR(101)||CHR(108)||
           CHR(13)||CHR(10)|| --перенос строки
           CHR(108)||CHR(111)
        FROM DUAL           
                
    19.2
    --Пример показывает применение функции CHR для машин, использующих
    --кодировку ASCII https://ru.wikipedia.org/wiki/ASCII с набором 
    --символов WE8ISO8859P1 для базы данных. Запрос вернет слово "CAT"
    SELECT CHR(67)||CHR(65)||CHR(84) "WordCAT"
        FROM DUAL
    
    19.3
    --В кодировке (для машин IBM) EBCDIC с набором символов WE8EBCDIC1047, чтобы 
    --вернуть слово CAT, требуется указать другие числа.
    SELECT CHR(195)||CHR(193)||CHR(227) "WordCAT"
        FROM DUAL
        
    19.4
    --Следует помнить, что в однойбайтовых кодировках (т.е. без указания USING NCHAR_CS)
    --для десятчиных чисел более 256 будет применена функция MOD.
    --Следующие запросы возвращают почти одинаковый результат
    SELECT CHR(MOD(324,256))
        FROM DUAL        
    UNION ALL
    SELECT CHR(324)
        FROM DUAL    

    19.5
    --В следующем примере используем конструкцию SING NCHAR_CS, которая
    --указывает на применение кодовой страницы UTF-16LE. Тем самым можно получать
    --другие национальные символы, а не только латинские (как в UTF-8) 
    --1) Для примера получим букву Ф. 
    --В таблице кодировки UTF16LE
    --https://upload.wikimedia.org/wikipedia/commons/0/01/Unifont_Full_Map.png
    --русская буква Ф имеет HEX-значение равное 0424. Это многобайтовый символ, а
    --значит MOD(X,256) не применится. Далее переведем данное HEX значение в 
    --десятичное число, т.е в 1060. Теперь применим функцию CHR с указанием 
    --USING NCHAR_CS и посмотрим результат.
    SELECT CHR(1060 USING NCHAR_CS)
        FROM DUAL
    --2) Теперь посмотрим букву Л. Она имеет HEX-значение 041B или в десятичном
    --виде равна числу 1051
    SELECT CHR(1051 USING NCHAR_CS)
        FROM DUAL

20. CLUSTER_DETAILS
Синтаксис:
    CLUSTER_DETAILS(       -> model ->                              ->         -> 
                    СХЕМА.          -> , -> cluster_id ->                 DESC,   
                                                        -> , -> topN    ASC
                                                                       ABS

    -> mining_attribute_clause)
    
Аналитический синтаксис:
    CLUSTER_DETAILS(INTO -> n ->                               ->        ->
                              -> , -> cluster_id ->               DESC,
                                                 -> , -> topN    ASC,
                                                                 ABS
                                                                 
    -> mining_attribute_clause) OVER (mining_analytic_clause)
    
    "mining_attribute_clause":
    USING -> *                            ->                                        
          -> schema.                    
          ->         -> table.* ->   -> 
          -> expr ->                  , <-        
                  -> AS alias 
                  
    "mining_analytic_clause":        
    ->                           -> 
       query_partition_clause     order_by_clause
    
    См. также: "Analytic Functions" на стр. 7-12 в "Oracle SQL Language Reference 12c
    Release 1 (12.1) E41329 25 july 2017", чтобы больше узнать о синтаксисе,
    семантике и ограничениях конструкции mining_analytic_clause.
Значение:    
        CLUSTER_DETAILS возвращает сведения о кластере для каждой строки в запросе.
    Возвращается значение в виде XML строки описывающей атрибуты наиболее используемого
    кластера или кластера, для которого указан cluster_id.
        topN. Если вы указали значение для "topN", то функция вернет N атрибутов, 
    которые    больше всего влияют на кластерное распределение (оценку). Если topN 
    не определено, то функция вернет 5 наиболее влиятельных атрибутов.
        DESCASC, или ABS.    Возвращаемые атрибуты сортируются по весу. Вес атрибута 
    выражает его положительное или отрицательное влияние на кластерное распределение.
    Положительный вес показывает повышенную вероятность в распределении. Негативный 
    вес показывает пониженную вероятность в распределении.
        По умолчанию, CLUSTER_DETAILS возвращает атрибуты с наибольшим положительным
    весом (DESC). Если указать ASC, то вернутся атрибуты с наибольшим отрицательным
    весом. Если указать ABS, то вернутся атрибуты с наибольшим отрицательным или 
    положительным весом. Причем результат отсортируется по абсолютному значению от
    наибольшего к наименьшему. Атрибуты с нулевым весом не будут показаны.
        Выбор синтаксиса.
        CLUSTER_DETAILS может оценивать данные одним из двух способов: может применяться
    накопительная объектная модель к данным или могут динамически накапливаться данные,
    с помощью выполнения аналитического предложения, которое строит и применяет одну
    или несколько переходных накопительных моделей. О выборе обычного синтаксиса или
    аналитического можно сообщить следующее:
    * Обычный синтаксис - используйте этот синтаксис для оценки данных по заранее
    определенной модели.
    * Аналитический синтаксис - используйте его для оценки данных без заранее 
    определенной модели. Он включает конструкцию "INTO n", где n это число кластеров
    для вычисления, а также "mining_analytic_clause", который определяет должны ли
    быть разделены данные для построения нескольких моделей. "Mining_analytic_clause"
    поддерживает "query_partition_clause" и "order_by_clause". 
    (См. "analytic_clause::=" на странице 7-12 в "Oracle SQL Language Reference 12c 
    Release 1 (12.1) E41329 25 july 2017").
        mining_attribute_clause. "mining_attribute_clause" определяет атрибуты 
    столбца для использования в качестве прогностических параметров для оценки. 
    Когда функция вызывается с аналитическим синтаксисом, эти предикторы используются
    также для построения переходных моделей. Поведение "mining_attribute_clause" 
    описано в функции PREDICTION. (См. "mining_attribute_clause" на стр. 7-237 в 
    "Oracle SQL Language Reference 12c Release 1 (12.1) E41329 25 july 2017")
        См. также:
        * "Oracle Data Mining User's Guide" - информация об оценивании
        * "Oracle Data Mining Concepts" - информация о кластеризации 
Примеры:
    20.1 
    --1) В данном примере создадим кластер, индекс для него и две таблицы, 
    --содержащие одинаковый столбец ID_PRODUCT. Далее применим и посмотрим на 
    --результат функции CLUSTER_DETAILS
    CREATE CLUSTER MY_CLUSTER(ID_PRODUCT NUMBER);
    CREATE INDEX MY_INDEX_MY_CLUSTER ON CLUSTER MY_CLUSTER;
    CREATE TABLE TAB1(ID_PRODUCT NUMBER
                      EMP_NAME VARCHAR2(100))
        CLUSTER MY_CLUSTER (ID_PRODUCT);
    CREATE TABLE TAB2(ID_PRODUCT NUMBER
                      PROD_NAME VARCHAR2(100))
        CLUSTER MY_CLUSTER (ID_PRODUCT); 
    --2) Теперь мы имеем кластер, содержащий две таблицы. Это значит, что
    --общий столбец не будет хранится отдельно для каждой таблицы, а будет
    --одно место хранения для этого столбца. Это целесообразно делать для ускорения 
    --запросов к таблицам, которые соединяются по этой общей(им) колонке(кам).
    --Но операции UPDATEINSERTDELETE замедляться.
    --Вставим строки в таблицы.
    INSERT INTO TAB1(ID_PRODUCT, EMP_NAME) VALUES (1, 'EMP1');
    INSERT INTO TAB1(ID_PRODUCT, EMP_NAME) VALUES (2, 'EMP2');    
    INSERT INTO TAB1(ID_PRODUCT, EMP_NAME) VALUES (3, 'EMP3');
    INSERT INTO TAB2(ID_PRODUCT, PROD_NAME) VALUES (1, 'PRODUCT_1');
    INSERT INTO TAB2(ID_PRODUCT, PROD_NAME) VALUES (2, 'PRODUCT_2');
    INSERT INTO TAB2(ID_PRODUCT, PROD_NAME) VALUES (3, 'PRODUCT_3');            
    COMMIT;
    --3) Выполним запрос к созданным таблицам, чтобы увидеть, что физический адрес 
    --строк, т.е. их место хранения на диске, одинаковый.
    SELECT t1.ID_PRODUCT,
           t1.EMP_NAME,
           t1.ROWID ROWID_FROM_TAB1,
           t2.ROWID ROWID_FROM_TAB2,   
           t2.ID_PRODUCT,
           t2.PROD_NAME
        FROM TAB1 t1
            FULL JOIN TAB2 t2
            ON t1.ID_PRODUCT = t2.ID_PRODUCT
                ORDER BY t1.ID_PRODUCT
    --4) Применим функцию CLUSTER_DETAILS
    SELECT CLUSTER_DETAILS(MY_CLUSTER)
        FROM DUAL
    SELECT CLUSTER_ID(model USING 5)
        FROM 
    
21. COALESCE 
Синтаксис: 
    COALESCE(X1, X2, ..., Xn)
Значение:
        COALESCE возвращает первое не NULL X-выражение из списка выражений. Необходимо
    указать минимум два выражения. Если все X-выражения равны NULL, тогда функция
    вернет NULL.
        Oracle использует short-circuit оценивание. То есть СУБД оценивает каждое 
    значение X и сразу определяет NULL ли оно, вместо того, чтобы сначала оценить все 
    значения и только потом определить, какие из них NULL.
        Если все части X-выражения имеют числовой тип данных или тип данных, который
    может быть неявно преобразован в числовой тип данных, тогда СУБД Oracle определяет
    аргумент, имеющий наибольшую числовую точность, и неявно преобразует остальные 
    аргументы в такой тип данных и потом возвращает соответствующий тип данных.
        См. также: в "Oracle SQL Language Reference 12c Release 1 (12.1) E41329 25 
        july 2017") таблицу 2-10, "Implicit Type Conversion Matrix" на стр. 2-43
        для большей информации о неявном преобразовании и "Numeric Precedence" на 
        стр. 2-16 для информации о числовой точности.
    Эта функция является обобщением функции NVL.
        Вы также можете использовать COALESCE, как альтернативу CASE конструкции. 
    1) Например:
        COALESCE(X1, X2)
    эквивалентно конструкции
        CASE 
            WHEN X1 IS NOT NULL 
                THEN X1 
            ELSE X2 
        END
    2) Или например:
        COALESCE(X1, X2, ..., Xn)
        где n >= 3,
    эквивалентно конструкции
        CASE 
            WHEN X1 IS NOT NULL 
                THEN X1
            ELSE COALESCE(X2, ..., Xn)
        END
        См. также: в "Oracle SQL Language Reference 12c Release 1 (12.1) E41329 25 
        july 2017") NVL на странице 7-217 и "CASE выражения" на странице 5-5.
Примеры:    
    21.1
    Пусть у нас имеется товар с закупочной ценой и ценой для продажи (наценка 30% от
    закупочной цены). В следующем месяце мы решили продавать товар уже с 50% наценкой,
    но для товаров, которые уже имели наценку 30% добавить только наценку равную 10%.
    --1) Создадим таблицу с ценами
    CREATE TABLE PRICES(PRODUCT VARCHAR2(100),
                        PRICE_30 NUMBER,
                        PRICE_0 NUMBER);
    INSERT INTO PRICES(PRODUCT, PRICE_30, PRICE_0)
        VALUES ('prod1', 11, NULL);
    INSERT INTO PRICES(PRODUCT, PRICE_30, PRICE_0)
        VALUES ('prod2', NULL, 12);
    INSERT INTO PRICES(PRODUCT, PRICE_30, PRICE_0)
        VALUES ('prod1', 14, 15);        
    COMMIT;
    --2) Выполним запрос, используя COALESCE
    SELECT PRODUCT,
           PRICE_30,
           PRICE_0,
           COALESCE(PRICE_30 * 1.10,
                    PRICE_0 * 1.50) NEW_PRICE
        FROM PRICES
            
22. COLLECT
Синтаксис: 
    COLLECT(  ...     COLUMN    ...    )
            DISTINCT         ORDER BY X 
            UNIQUE
Значение:
        COLLECT это агрегатная функция, которая принимает в качестве аргумента колонку
    любого типа и содает вложенную таблицу с типом выбранных строк. Чтобы получить
    корректные результаты этой функции следует указывать ее в функции CAST.
        Если колоннка является коллекцией, тогда возвращается вложенная таблица
    коллекций. Если колонка имеет пользовательский тип, тогда колонка должна иметь
    MAP или ORDER методы, чтобы можно было использовать операторы DISTINCTUNIQUE и
    ORDER BY.
        См. также: в "Oracle SQL Language Reference 12c Release 1 (12.1) E41329 25 
        july 2017") функцию CAST на стр. 7-37 и "Aggregate Functions" на стр. 7-10.
Примеры:
    22.1
    --1) Создадим типы NESTED TABLE
    CREATE TYPE TYPE_NUM_COLLECT AS TABLE OF NUMBER;
    CREATE TYPE TYPE_VAR_COLLECT AS TABLE OF VARCHAR2(100);
    --2) Создадим таблицу с данными
    CREATE TABLE TAB1 (NUM_COL NUMBER,  
                       CHAR_COL VARCHAR2(100));
    INSERT INTO TAB1 (NUM_COL, CHAR_COL) VALUES (1,    'number1');
    INSERT INTO TAB1 (NUM_COL, CHAR_COL) VALUES (2,    'number2');
    INSERT INTO TAB1 (NUM_COL, CHAR_COL) VALUES (2,    'number2');
    INSERT INTO TAB1 (NUM_COL, CHAR_COL) VALUES (3,    'number3');
    INSERT INTO TAB1 (NUM_COL, CHAR_COL) VALUES (3,    'number3');
    INSERT INTO TAB1 (NUM_COL, CHAR_COL) VALUES (NULL, 'number4');
    INSERT INTO TAB1 (NUM_COL, CHAR_COL) VALUES (4,    NULL);    
    COMMIT;
    --2) Напишем различные запросы, используя функицю COLLECT
    SELECT --с использованием встроенных типов
           CAST(COLLECT(NUM_COL) AS SYS.ODCINUMBERLIST) C_ODCI_NUM,
           CAST(COLLECT(CHAR_COL) AS SYS.ODCIVARCHAR2LIST) C_ODCI_VARC,           
           --с вышесозданными типами и сортировкой
           CAST(COLLECT(NUM_COL ORDER BY NUM_COL DESCAS TYPE_NUM_COLLECT) C_NUM,
           CAST(COLLECT(CHAR_COL ORDER BY NUM_COL DESCAS TYPE_VAR_COLLECT) C_VARC,
           --с DISTINCT и UNIQUE следует убирать сортировку
           CAST(COLLECT(DISTINCT NUM_COL) AS TYPE_NUM_COLLECT) C_NUM_D,
           CAST(COLLECT(UNIQUE CHAR_COL) AS TYPE_VAR_COLLECT) C_VARC_U           
        FROM TAB1
    
23. COMPOSE
Синтаксис: 
    COMPOSE(EXPR)
Значение:
        COMPOSE принимает в качестве аргумента строку или выражение, которое из 
    какого-нибудь типа можно представить строкой и возвращает строку в кодировке 
    UNICODE с тем же набором символов, что и в аргументе. Аргумент EXPR может быть 
    типом CHARVARCHAR2NCHAR, NVARCHAR2, CLOB ли NCLOB. Для примера, o кодовая
    точка распознается, как умлаут кодовая точка, будет возвращена функцией, как 
    о-умлаут кодовая точка, т.е. будет композиция.
        COMPOSE возвращает строку в NFC-нормальной форме. Для специфической настройки,
    вы можете сперва вызывать DECOMPOSE c настройкой CANONICAL и затем COMPOSE. Эта 
    комбинация возвращает строку в NFKC-нормальной форме.
        CLOB и NCLOB значения поддерживаются через неявное преобразование. Если EXPR
    это символ LOB значения, тогда произойдет преобразование в VARCHAR значение до 
    операции COMPOSE. Эта операция завершится ошибкой если LOB-значение превысит
    поддерживаемую длину VARCHAR в конкретной среде разработки.
        См. также "Oracle Database Globalization Support Guide" для информации о 
        наборе символов Юникода и семантике символов.
        DECOMPOSE на странице 7-94
Примеры:
    23.1
    Следующий пример возвращает о-умлаут кодовую точку, т.е. композицию из o кодовой
    точки и умлаут кодовой точки.
    SELECT COMPOSE( 'o' || UNISTR('\0308') )
        FROM DUAL
    
24.    CON_DBID_TO_ID
Синтаксис:
    CON_DBID_TO_ID(container_dbid)
Значение:
        CON_DBID_TO_ID принимает в качестве аргумента DBID контейнера и возвращает 
    ID контейнера. Причем только для container_dbid имеющих значение с типом NUMBER 
    или со значением, которое может быть неявно преобразовано в NUMBER. Функция
    возвращает значение с типом NUMBER.
        Эта функция полезна в многопользовательской контейнерной базе данных (CDB). 
    Если вы используете    эту функцию не в CDB-базах данных, то вернется 0.
Примеры:
    24.1
    Следующий пример показывает ID и DBID для всех контейнеров в CDB-базе данных
    и рядом также отражает применение функции.
    SELECT CON_ID,
           DBID,
           CON_DBID_TO_ID(DBID) "CONTAINER_ID"
        FROM V$CONTAINERS
        
25. CON_GUID_TO_ID
Синтаксис:
    CON_GUID_TO_ID(container_guid)
Значение:
        CON_GUID_TO_ID принимает в качестве аргумента GUID (globally unique identifier) 
    контейнера и возвращает ID контейнера. Причем container_guid должен иметь значение
    типа RAW. Функция возвращает значение типа NUMBER.
        Эта функция полезна в многопользовательской контейнерной базе данных (CDB). 
    Если вы используете    эту функцию не в CDB-базах данных, то вернется 0.    
Примеры:
    25.1
    Следующий пример показывает ID и GUID для всех контейнеров в CDB-базе данных.
    GUID хранится, как 16-битное RAW значение, во вью V$CONTAINERS. Запрос вернет
    32-символьное шестнадцатеричное представление GUID. Также отобразим колонку с
    функцией CON_GUID_TO_ID, в которую передадим GUID, обработанный функцией HEXTORAW.
    SELECT CON_ID,
           GUID,
           CON_GUID_TO_ID(HEXTORAW(GUID)) "CONTAINER_ID"
        FROM V$CONTAINERS

26. CON_NAME_TO_ID
Синтаксис:
    CON_NAME_TO_ID(container_name)
Значение:
        CON_NAME_TO_ID принимает в качестве аргумента имя контейнера и возвращает ID 
    контейнера. Причем container_name должен быть типа STRING или выражением с типом,
    который можно преобразовать в STRING. Функция возвращает значение с типом NUMBER.
        Функция полезна в многопользовательской контейнерной базе данных (CDB).
    Если вы используете    эту функцию не в CDB-базах данных, то вернется 0.
Примеры:
    26.1 
    Следующий пример отображает ID и имя для всех контейнеров в CDB-базе данных.
    SELECT CON_ID, 
           NAME,
           CON_NAME_TO_ID(NAME) "CONTAINER_ID"
        FROM V$CONTAINERS

27. CON_UID_TO_ID
Синтаксис:
    CON_UID_TO_ID(container_uid)
Значение:
        CON_UID_TO_ID принимает в качестве аргумента UID (unique identifier) и 
    возвращает ID контейнера. Причем container_uid должен иметь значение типа NUMBER
    или любое значение, которое может быть неявно преобразовано в NUMBER. Функция
    возвращает значение с типом NUMBER.
        Функция полезна в многопользовательской контейнерной базе данных (CDB).
    Если вы используете    эту функцию не в CDB-базах данных, то вернется 0.        
Примеры:
    27.1
    Следующий пример отображает ID и UID для всех контейнеров в CDB-базе данных.
    SELECT CON_ID,
           CON_UID,
           CON_UID_TO_ID(CON_UID) "CONTAINER_ID"
        FROM V$CONTAINERS

Добавить комментарий


Защитный код
Обновить

Форма авторизации