Тип данных rowid oracle
Индексы ROWID — это объекты базы данных, обеспечивающие отображение всех значений столбца таблицы, а также идентификаторов ROWID всех строк таблицы, в которых содержатся значения столбца.
Пример:
SELECT fam, ROWID FROM student;
FAM ROWID
——————————————
ИВАНОВ AAAA3kAAGAAAAGsAAA
ПЕТРОВ AAAA3kAAGAAAAGsAAB
В базе данных Oracle индексы используются для разных целей: для обеспечения уникальности значений в базе данных, для повышения производительности поиска записей в таблице и др. Производительность повышается благодаря тому, что в критерии поиска данных в таблице включается ссылка на индексированный столбец или столбцы. В Oracle индексы можно создавать по любому столбцу таблицы, кроме столбцов типа LONG. Индексы проводят различие между приложениями, для которых скорость не важна, и интенсивно функционирующими приложениями, что особенно касается работы с большими таблицами. Однако, прежде чем принять решение о создании индекса, необходимо взвесить все «за» и «против» в отношении производительности системы. Производительность не повысится, если просто ввести индекс и забыть о нем.
Рекомендации по созданию индексов ROWID:
Хотя наибольшее повышение производительности достигается созданием индекса по столбцу, все значения которого уникальны, похожий результат можно получить и для столбцов, содержащих одинаковые значения или NULL-значения. Для создания индекса совсем не обязательно, чтобы значения столбца были уникальны. Приведем ряд рекомендаций, обеспечивающих нужное повышение производительности при использовании стандартного индекса, а также рассмотрим вопросы, связанные с балансом между производительностью и расходованием дискового пространства при создании индекса.
Использование индексов для поиска информации в таблицах может дать значительное повышение производительности по сравнению с просмотром таблиц, столбцы которых неиндексированы. Однако выбрать правильный индекс совсем непросто. Конечно, для индексирования с помощью индекса В-дерева предпочтителен столбец, все значения которого уникальны, но и столбец, не отвечающий этим требованиям,— неплохой кандидат, если только одинаковые значения содержатся примерно в 10% его строк и никак не более. Столбцы-«переключатели», или «флаги», например те в которых хранятся сведения о поле человека, для индексов В-дерева не годятся Не подходят и те столбцы, которые используются для хранения небольшого числа «достоверных значений», а также хранящие какие-то признаки, например «достоверность» или «недостоверность», «активность» или «неактивность», «да» или «нет» и т. д, и т. п. Наконец, индексы с обратными ключами применяются, как правило, там, где установлен и функционирует Oracle Parallel Server и нужно до максимума повысить уровень параллельности в базе данных.
Типы данных UROWID и ROWID предназначены для работы с идентификаторами строк базы данных. ROWID — идентификатор строки (ROW IDentifier), а точнее, двоичное значение, однозначно идентифицирующее строку данных в таблице Oracle, даже если таблица не имеет уникального ключа. Две записи, даже если они содержат одинаковые значения столбцов, обладают разными идентификаторами ROWID или UROWID .
Учтите, что значения ROWID в таблицах могут изменяться. В ранних версиях Oracle (Oracle8 и ранее) значения ROWIDs оставались неизменными на протяжении жизненного цикла строки. Но в версии Oracle8i были добавлены новые возможности, нарушающие это старое правило. Если для обычной или индексной таблицы разрешено перемещение строк, обновление может привести к изменению ROWID или UROWID строки. Кроме того, если с таблицей будет выполнена операция, из-за которой строка перейдет из одного физического блока данных в другой блок, значение ROWID строки изменится.
Впрочем, даже с учетом этого предупреждения значения ROWID приносят практическую пользу. Включение значений ROWID в командах SELECT, UPDATE, MERGE и DELETE в некоторых случаях повышает скорость обработки, поскольку обращение к строке по ее идентификатору выполняется быстрее, чем по первичному ключу. На рис. 1 использование ROWID в команде UPDATE сравнивается с использованием значений столбцов (например, первичного ключа).
Рис. 1. Идентификатор ROWID ссылается непосредственно на строку таблицы
Исторически тип ROWID появился раньше типа UROWID . По мере добавления новых функциональных возможностей, таких как использование индекс-таблиц и шлюзов к другим базам данных, компания Oracle, естественно, разрабатывала и новые типы идентификаторов строк, и новые типы данных для их хранения. Так появился тип данных UROWID , используемый для хранения идентификаторов строк таблиц любого типа. Буква U в его названии означает « Universal » (универсальный), а переменная UROWID может содержать любое значение ROWID из любого типа таблиц.
Тип данных UROWID рекомендуется использовать во всех новых программах, работающих с идентификаторами строк. Тип ROWID обеспечивает обратную совместимость, но он не поддерживает все типы идентификаторов строк, использующихся в современных базах данных Oracle. Тип UROWID надежнее — он поддерживает все типы ROWID , сохраняя все преимущества ускоренного доступа.
Двоичные данные
Oracle поддерживает несколько разновидностей двоичных данных — неструктурированных данных, не интерпретируемых и не обрабатываемых Oracle. К их числу относятся типы RAW , BLOB и BFILE . Тип BFILE используется для хранения неструктурированных двоичных данных в файлах операционной системы вне базы данных. Тип RAW имеет переменную длину, а при операциях с ним Oracle не выполняет преобразование символов при передаче данных. В остальном он аналогичен символьному типу VARCHAR2 .
Тип данных LONG RAW поддерживается для обеспечения обратной совместимости, но в PL/SQL поддержка данных LONG RAW ограничена. В базе данных Oracle столбец LONG RAW занимает до 2 Гбайт, но PL/SQL позволяет работать только с первыми 32 760 байтами LONG RAW . Если, например, вы попытаетесь выполнить выборку в переменную PL/SQL из столбца LONG RAW , превышающего лимит в 32 760 байт, произойдет ошибка:
Для работы с данными LONG RAW , превышающими лимит PL/SQL, потребуется программа OCI; кстати, это веская причина для перевода старого кода с LONG RAW на данные BLOB , не имеющие такого ограничения.
Типы данных «Any»
Большая часть программного кода предназначается для решения узкоспециализированных задач. Однако иногда нам приходится писать более универсальные программы. Именно для таких ситуаций предназначены типы данных Any .
Эта группа типов данных, появившаяся в Oracle9i, заметно отличается от любых других типов данных Oracle. Типы данных Any позволяют динамически инкапсулировать описания типов, экземпляры данных и наборы экземпляров данных любого другого типа SQL. С помощью этих объектных типов (и определенных для них методов) можно, к примеру, определить тип данных, хранимых во вложенной таблице, не обращаясь к объявлению типа этой таблицы!
В группу типов данных Any входят AnyType , AnyData и AnyDataSet .
Символьные типы данных
PL/SQL поддерживает строки фиксированной и переменной длины, состоящие как из традиционных символов, так и из символов Юникода. К строкам первого типа относятся строки CHAR и NCHAR , а к строкам второго вида — VARCHAR2 и NVARCHAR2 . Объявление строки переменной длины, которая может содержать до 2000 символов, выглядит так:
Для очень длинных символьных строк в PL/SQL предусмотрены типы данных CLOB (Character Large Object) и NCLOB (NLS Character Large Object). По соображениям совместимости PL/SQL также поддерживает тип данных LONG. Эти типы данных позволяют сохранять и обрабатывать очень большие объемы данных; так, в Oracle11g тип LOB способен хранить до 128 терабайт информации.
Использование типа LONG ограничивается множеством правил. Мы не рекомендуем применять его в Oracle8 и последующих версиях.
Типы данных ROWID и UROWID
Oracle поддерживает два типа данных ROWID и UROWID , предназначенных для предоставления адреса строки в таблице. Тип ROWID представляет уникальный физический адрес строки в таблице, а тип UROWID — логическую позицию строки в индексной таблице (Index-Organized Table, IOT). Тип ROWID также является псевдостолбцом SQL, который может включаться в инструкции SQL.
Получение идентификаторов строк
Чтобы получить ROWID для строки таблицы, добавьте ключевое слово в список выборки.
В терминологии Oracle ROWID называется «псевдостолбцом», потому что на самом деле столбца с именем ROWID в таблице не существует. Значение ROWID ближе к указателю — оно содержит физический адрес строки в таблице.
Типы данных для поддержки интернет-технологий
В Oracle9i появилась встроенная поддержка ряда технологий и типов данных, связанных с Интернетом, в частности XML (eXtensible Markup Language) и URI (Universal Resource Identifier). В Oracle имеются специализированные типы для работы с данными XML и URI, а также специальный класс идентификаторов URI ( DBUri-REF ), который используется для доступа к базе данных. Кроме того, в Oracle появился новый набор типов данных, обеспечивающий хранение внешних и внутренних URI и обращение к ним из базы данных.
Тип XMLType предназначен для запроса и сохранения данных в формате XML. Для работы с XML используются такие функции, как SYS_XMLGEN из пакета DBMS_XMLGEN . Поддержка XPath и встроенные команды языка SQL позволяют выполнять поиск данных в документах XML.
148.4 DBMS_ROWID Operational Notes
These operation notes apply to DBMS_ROWID .
Some of the functions in this package take a single parameter, such as a ROWID . This can be a character or a PL/SQL ROWID , either restricted or extended, as required.
You can call the DBMS_ROWID functions and procedures from PL/SQL code, and you can also use the functions in SQL statements.
ROWID_INFO is a procedure. It can only be used in PL/SQL code.
You can use functions from the DBMS_ROWID package just like built-in SQL functions; in other words, you can use them wherever you can use an expression. In this example, the ROWID_BLOCK_NUMBER function is used to return just the block number of a single row in the EMP table:
If Oracle returns the error "ORA:452, 0, 'Subprogram '%s' violates its associated pragma' for pragma restrict_references , it could mean the violation is due to:
A problem with the current procedure or function
Calling a procedure or function without a pragma or due to calling one with a less restrictive pragma
Calling a package procedure or function that touches the initialization code in a package or that sets the default values
Символьные типы данных PL/SQL
PL/SQL поддерживает строки как фиксированной, так и переменной длины, представленные как в традиционных кодировках, так и в кодировках Unicode. CHAR и NCHAR - это типы строк фиксированной длины, а VARCHAR2 и NVARCHAR2 - типы строк переменной длины. Рассмотрим объявление строки переменной длины, которая может вмещать до 2000 символов:
Oracle также поддерживает очень длинные символьные строки - типы LONG и LOB . Эти типы данных позволяют хранить и обрабатывать огромные объемы данных: LOB может содержать до 128 терабайт информации в Oracle Database 10g (используйте тип LONG только для совместимости с уже существующим кодом. Будущее за типами LOB!). К символьным типам данных LOB относятся CLOB (character large object - большой символьный объект) и NCLOB (National Language Support character large object - большой символьный объект с поддержкой национальных языков, многобайтный формат).
148.6 Summary of DBMS_ROWID Subprograms
This table lists the DBMS_ROWID subprograms and briefly describes them.
Returns the block number of a ROWID
Creates a ROWID , for testing only
Returns the type and components of a ROWID
Returns the object number of the extended ROWID
Returns the file number of a ROWID
Returns the row number
Returns the absolute file number associated with the ROWID for a row in a specific table
Converts a ROWID from restricted format to extended
Converts an extended ROWID to restricted format
Returns the ROWID type: 0 is restricted, 1 is extended
Checks if a ROWID can be correctly extended by the ROWID_TO_EXTENDED function
148.6.1 ROWID_BLOCK_NUMBER Function
This function returns the database block number for the input ROWID .
ROWID to be interpreted
The type of the tablespace (bigfile/smallfile) to which the row belongs
The example SQL statement selects the block number from a ROWID and inserts it into another table:
148.6.2 ROWID_CREATE Function
This function lets you create a ROWID , given the component parts as parameters.
This is useful for testing ROWID operations, because only the Oracle Server can create a valid ROWID that points to data in a database.
Type (restricted or extended)
Set the rowid_type parameter to 0 for a restricted ROWID . Set it to 1 to create an extended ROWID .
If you specify rowid_type as 0, then the required object_number parameter is ignored, and ROWID_CREATE returns a restricted ROWID .
Data object number ( rowid_object_undefined for restricted)
Relative file number
Block number in this file
Returns row number in this block
Create a dummy extended ROWID :
Find out what the rowid_object function returns:
The variable obj_number now contains 9999.
148.6.3 ROWID_INFO Procedure
This procedure returns information about a ROWID , including its type (restricted or extended), and the components of the ROWID .
This is a procedure, and it cannot be used in a SQL statement.
ROWID to be interpreted. This determines if the ROWID is a restricted (0) or extended (1) ROWID .
Returns type (restricted/extended)
Returns data object number ( rowid_object_undefined for restricted)
Returns relative file number
Returns block number in this file
Returns row number in this block
This example reads back the values for the ROWID that you created in the ROWID_CREATE :
148.6.4 ROWID_OBJECT Function
This function returns the data object number for an extended ROWID .
The function returns zero if the input ROWID is a restricted ROWID .
ROWID to be interpreted
The ROWID_OBJECT_UNDEFINED constant is returned for restricted ROWIDs .
148.6.5 ROWID_RELATIVE_FNO Function
This function returns the relative file number of the ROWID specified as the IN parameter. (The file number is relative to the tablespace.)
ROWID to be interpreted
Type of the tablespace (bigfile/smallfile) to which the row belongs
The example PL/SQL code fragment returns the relative file number:
148.6.6 ROWID_ROW_NUMBER Function
This function extracts the row number from the ROWID IN parameter.
ROWID to be interpreted.
Select a row number:
148.6.7 ROWID_TO_ABSOLUTE_FNO Function
This function extracts the absolute file number from a ROWID , where the file number is absolute for a row in a given schema and table.
The schema name and the name of the schema object (such as a table name) are provided as IN parameters for this function.
ROWID to be interpreted
Name of the schema which contains the table
For partitioned objects, the name must be a table name, not a partition or a sub/partition name.
148.6.8 ROWID_TO_EXTENDED Function
This function translates a restricted ROWID that addresses a row in a schema and table that you specify to the extended ROWID format.
Later, it may be removed from this package into a different place.
ROWID to be converted
Name of the schema which contains the table (optional)
Table name (optional).
The following constants are defined:
ROWID_TO_EXTENDED returns the ROWID in the extended character format. If the input ROWID is NULL , then the function returns NULL . If a zero-valued ROWID is supplied (00000000.0000.0000), then a zero-valued restricted ROWID is returned.
Assume that there is a table called RIDS in the schema SCOTT , and that the table contains a column ROWID_COL that holds ROWIDs (restricted), and a column TABLE_COL that point to other tables in the SCOTT schema. You can convert the ROWIDs to extended format with the statement:
If the schema and object names are provided as IN parameters, then this function verifies SELECT authority on the table named, and converts the restricted ROWID provided to an extended ROWID , using the data object number of the table. That ROWID_TO_EXTENDED returns a value, however, does not guarantee that the converted ROWID actually references a valid row in the table, either at the time that the function is called, or when the extended ROWID is actually used.
If the schema and object name are not provided (are passed as NULL ), then this function attempts to fetch the page specified by the restricted ROWID provided. It treats the file number stored in this ROWID as the absolute file number. This can cause problems if the file has been dropped, and its number has been reused prior to the migration. If the fetched page belongs to a valid table, then the data object number of this table is used in converting to an extended ROWID value. This is very inefficient, and Oracle recommends doing this only as a last resort, when the target table is not known. The user must still know the correct table name at the time of using the converted value.
If an extended ROWID value is supplied, the data object number in the input extended ROWID is verified against the data object number computed from the table name parameter. If the two numbers do not match, the INVALID_ROWID exception is raised. If they do match, the input ROWID is returned.
ROWID_TO_EXTENDED cannot be used with partition tables.
The ROWID_VERIFY Function has a method to determine if a given ROWID can be converted to the extended format.
При объявлении переменной или константы вы должны назначить ей тип данных, поскольку PL/SQL за очень небольшими исключениями является языком со строгой типизацией. PL/SQL предлагает полный набор предопределенных скалярных и составных типов данных, вы также можете создавать собственные пользовательские типы (которые также называют абстрактными типами данных).
Все имеющиеся предопределенные типы данных определены в PL/ SQL-пакете STANDARD. Например, туда включены операторы, определяющие логический тип данных и два числовых типа:
PL/SQL поддерживает все привычные типы данных и множество других. В данной публикации приведен лишь краткий обзор разнообразных предопределенных типов данных.
Логические типы данных PL/SQL
PL/SQL поддерживает настоящий логический (булев) тип данных. Переменная этого типа может иметь лишь одно из трех значений: TRUE, FALSE и NULL.
Логические переменные позволяют сделать код удобочитаемым, даже в том случае, когда он содержит сложные логические выражения. Рассмотрим пример объявления переменной типа Boolean с присваиванием ей значения по умолчанию:
Пользовательские типы данных
Из встроенных типов данных Oracle и пользовательских типов можно строить типы данных произвольной сложности, которые с большой точностью отражают структуру и поведение данных в конкретных системах. В базе данных Oracle они получили еще название абстрактных типов данных.
The DBMS_ROWID package lets you create ROWIDs and obtain information about ROWID s from PL/SQL programs and SQL statements. You can find the data block number, the object number, and other ROWID components without writing code to interpret the base-64 character external ROWID . DBMS_ROWID is intended for upgrading from Oracle database version 7 to Oracle database version 8.X.
DBMS_ROWID is not to be used with universal ROWIDs ( UROWIDs ).
This chapter contains the following topics:
Использование идентификаторов строк
Преимущества использования ROWID проявляются при повторном обращении к строке, если оно производится часто или сопряжено со значительными затратами ресурсов. Вспомните пример из предыдущего раздела, когда мы извлекали из базы данных информацию об окладе работника. Допустим, нам потребовалось изменить величину оклада и ввести в базу данных новое значение. Конечно, для этого можно написать команду UPDATE с тем же условием WHERE , которое использовалось в команде SELECT :
Конечно, этот код работает, но у него есть недостаток: необходимость повторения для UPDATE пути доступа, который уже использовался для SELECT . Скорее всего, поиск нужной записи потребовал обращения к одному-двум индексам. Но ведь программа уже обращалась к этим индексам для команды SELECT , так зачем выполнять всю работу дважды? Обращение к индексу производилось для получения ROWID с целью прямого обращения к записи. Включая значение ROWID в команду SELECT , я могу просто передать его команде UPDATE и обойтись без лишнего поиска по индексу:
Вспомните предупреждение о возможном изменении ROWID . Если в многопользовательской системе ROWID строки изменятся между командами SELECT и UPDATE , то код не будет работать так, как задумано. Почему? Потому что при разрешенном перемещении строк в стандартной таблице ROWID этой строки таблицы может измениться. А перемещение строк может быть разрешено потому, что администратор базы данных желает провести оперативную реорганизацию таблицы, или таблица может быть разбита на блоки, и перемещение строки позволит записи переместиться из одного блока в другой в процессе обновления.
Иногда для достижения аналогичного результата проще всего воспользоваться для выборки данных явным курсором, с последующей модификацией или удалением с применением конструкции WHERE CURRENT OF CURSOR .
Конечно, использование ROWID ускоряет работу программ PL/SQL, потому что вы по сути опускаетесь на физический уровень управления базой данных. Однако хорошие приложения обычно не зависят от физической структуры данных. Они поручают управление физической структурой базе данных и административным программам, а сами ограничиваются логическим управлением данными. По этой причине использовать ROWID в приложениях обычно не рекомендуется.
При объявлении переменной или константы необходимо задать ее тип данных (PL/SQL, за некоторыми исключениями, относится к языкам со статической типизацией — см. ниже врезку). В PL/SQL определен широкий набор скалярных и составных типов данных; кроме того, вы можете создавать пользовательские типы данных. Многие типы данных PL/SQL (например, BOOLEAN и NATURAL ) не поддерживаются столбцами баз данных, но в коде PL/SQL эти типы весьма полезны.
Практически все заранее определенные типы данных определяются в пакете PL/SQL STANDARD . Например, определение типа данных BOOLEAN и двух числовых типов данных может выглядеть так:
PL/SQL поддерживает распространенный «джентльменский набор» типов данных, а так-же ряд других типов. В этом разделе приводится краткий обзор различных предопределенных типов данных.
ЧТО ТАКОЕ «СТАТИЧЕСКАЯ ТИПИЗАЦИЯ »?
Статической (или сильной) типизацией называется проверка типов во время компиляции (а не на стадии выполнения программы). К числу языков программирования, использующих сильную типизацию, относятся PL/SQL, Ada, C и Pascal. Языки с динамической типизацией (такие, как JavaScript, Perl или Ruby) выполняют большинство проверок типов во время выполнения. Статическая типизация позволяет выявлять ошибки во время компиляции, что повышает надежность программ. Преимуществом статической типизации является и ускорение выполнения программ. Оптимизирующий компилятор, который знает точные типы данных, может подбирать более эффективные ассемблерные решения и генерировать высокооптимизированный машинный код. Динамическая типизация тоже обладает своими преимуществами: например, метаклассы и интроспекция проще реализуются на базе динамической типизации.
Тип данных REF CURSOR
Тип данных REF CURSOR позволяет объявлять курсорные переменные, которые могут использоваться со статическими и динамическими SQL-командами для улучшения гибкости программного кода. Тип REF CURSOR существует в двух формах: сильной и слабой. PL/SQL относится к категории языков со статической типизацией, а слабый тип REF CURSOR является одной из немногочисленных конструкций с динамической типизацией.
В следующем примере объявления сильной формы REF CURSOR курсорная переменная связывается с конкретной структурой записи с помощью атрибута %ROWTYPE :
Далее следуют два слабых объявления REF CURSOR , в которых переменная не связывается ни с какой конкретной структурой. Во втором объявлении (строка 4) представлен тип SYS_REFCURSOR — заранее определенный слабый тип REF CURSOR .
Даты, временные метки и интервалы в PL/SQL
До появления версии Oracle9/ Database мир дат Oracle ограничивался типом DATE, который позволял хранить как дату, так и время (с точностью до секунд). В Oracle9/ Database появились два набора новых связанных типов данных: INTERVAL и TIMESTAMP. Новые типы значительно расширили возможности разработчиков PL/SQL по созданию программ, обрабатывающих и хранящих значения дат и времени с очень высокой точностью, а также вычисляющих и хранящих интервалы времени.
Приведем в качестве примера функцию, вычисляющую возраст человека:
148.3 DBMS_ROWID Exceptions
This table describes the Exceptions raised by DBMS_ROWID subprograms.
Invalid rowid format
Block is beyond end of file
Числовые типы данных
В PL/SQL поддерживаются как вещественные, так и целочисленные типы данных. Тип NUMBER давно был основным типом для работы с числовыми данными; он может применяться для работы с целыми и вещественными данными как с фиксированной, так и с плавающей запятой. Пример типичного объявления NUMBER :
Из-за своей внутренней десятичной природы тип NUMBER особенно удобен при работе с денежными суммами. В отличие от двоичного представления, ему не присущи ошибки округления. Например, если сохранить в нем значение 0.95, позднее вы прочитаете именно эту величину, а не приближенную (скажем, 0.949999968).
До выхода Oracle10g тип NUMBER был единственным числовым типом данных PL/SQL, напрямую соответствовавшим типу столбцов базы данных. В этом нетрудно убедиться, изучив содержимое пакета STANDARD . Данная особенность стала одной из причин, по которым тип NUMBER так широко применялся в программах PL/SQL.
В Oracle10g появились два двоичных типа с плавающей запятой: BINARY_FLOAT и BINARY_DOUBLE . Как и NUMBER , эти двоичные типы данных поддерживаются и в PL/SQL, и в базах данных. Однако в отличие от NUMBER , эти типы хранят значение в двоичном виде, а следовательно, при работе с ними могут возникнуть погрешности округления. Типы BINARY_FLOAT и BINARY_DOUBLE поддерживают специальные значения NaN (Not a Number, «не является числом»), положительную и отрицательную бесконечность. В некоторых типах приложений эти типы обеспечивают огромный выигрыш в быстродействии, так как вычисления с этими двоичными типами по возможности выполняются на аппаратном уровне.
В Oracle11g появились еще две разновидности вещественных типов. Типы SIMPLE_FLOAT и SIMPLE_DOUBLE являются аналогами BINARY_FLOAT и BINARY_DOUBLE , но они не поддерживают NULL и не инициируют исключение в случае переполнения.
PL/SQL поддерживает несколько числовых типов и подтипов, не имеющих прямого соответствия среди типов баз данных, но все равно полезных. Особого внимания заслуживают PLS_INTEGER и SIMPLE_INTEGER . Операции с целочисленным типом PLS_INTEGER реализуются на аппаратном уровне. В частности, счетчики циклов FOR реализуются в формате PLS_INTEGER . Тип SIMPLE_INTEGER , появившийся в Oracle11g, обладает тем же диапазоном значений, что и PLS_INTEGER , но не поддерживает NULL и не инициирует исключение в случае переполнения. SIMPLE_INTEGER , как и SIMPLE_FLOAT с SIMPLE_DOUBLE , работает невероятно быстро — особенно с откомпилированным кодом.
Двоичные данные PL/SQL
Oracle поддерживает несколько видов двоичных данных (это неструктурированные данные, которые не интерпретируются и не обрабатываются Oracle), в том числе RAW, LONG RAW, BFILE и BLOB. Тип данных BFILE хранит неструктурированные двоичные данные в файлах операционной системы вне базы данных. RAW - это тип данных переменной длины, подобный символьному типу данных VARCHAR2 и отличающийся от него тем, что утилиты Oracle не выполняют преобразования символов при передаче данных типа RAW.
Логические данные
PL/SQL поддерживает тип данных BOOLEAN . Переменные этого типа могут принимать одно из трех значений ( TRUE, FALSE или NULL ).
Логические переменные помогают писать понятный, легко читаемый код даже в тех случаях, когда он содержит очень сложные логические выражения. Пример объявления логической переменной с присваиванием ей значения по умолчанию:
Типы данных для сети Интернет в PL/SQL
В версии Oracle9i Database появилась встроенная поддержка различных связанных с Интернетом типов данных и технологий, в частности XML (Extensible Markup Language - расширяемый язык разметки) и URI (Universal Resource Identifiers - универсальные идентификаторы ресурсов). Oracle поддерживает типы данных, используемые для работы с данными XML и URI, а также специальный класс DBUri-REF, который применяется для доступа к данным, хранящимся внутри самой базы данных. Oracle также предоставляет новый набор типов для хранения внешних и внутренних URI и доступа к ним из базы данных.
Тип XMLType позволяет хранить в базе данных Oracle данные XML и обращаться к ним с запросами при помощи таких функций, как SYS_XMLGEN, и пакета DBMS_XMLGEN. Он также позволяет использовать операторы языка SQL для выполнения поиска при помощи языка XPath.
REF CURSOR
Тип данных REF CURSOR позволяет объявлять курсорные переменные, которые могут использоваться со статическими и динамическими командами SQL для реализации чрезвычайно гибких требований. Этот тип данных имеет две разновидности: строгий REF CURSOR и нестрогий REF CURSOR. Нестрогий REF CURSOR - это один из немногих доступных вам типов данных со слабой типизацией.
Рассмотрим пример объявления строгого типа REF CURSOR (ассоциируем курсорную переменную с конкретной записью при помощи атрибута %ROWTYPE):
Теперь рассмотрим два объявления нестрогого типа REF CURSOR, в которых никакая конкретная структура не ассоциируется с результирующей переменной. В четвертой строке представлен SYS_REFCURSOR, пред¬определенный нестрогий тип REF CURSOR.
ROWID
Oracle поддерживает два собственных типа данных, ROWID и UROWID, которые используются для представления адреса строки в таблице. ROWID - это уникальный адрес строки в соответствующей таблице, а UROWID - логическая позиция строки в индекс-таблице (index-organized table, IOT). ROWID также является SQL-псевдонимом, который может использоваться в командах SQL.
Типы данных «Any» PL/SQL
Обычно перед программистом стоит вполне конкретная задача с жестко заданными требованиями. Но случается и так, что необходимо написать нечто общее, для широкого применения. В таких случаях удобно использовать типы данных «Any».
Типы «Any» появились в версии Oracle9/ Database Release 1. Они значительно отличаются от любых других типов данных, доступных в Oracle. Эти типы позволяют динамически инкапсулировать описания типов, экземпляры данных и наборы экземпляров данных любого другого типа SQL, а также обращаться к таким объектам. Вы можете использовать эти типы (и методы, определенные для них как для объектных типов), например для определения типа данных, хранящихся в некоторой вложенной таблице, без обращения к реальному объявлению типа данной таблицы.
Группа типов данных «Any» включает в себя AnyType, AnyData и Any- DataSet.
Получение идентификаторов строк
Чтобы получить ROWID для строки таблицы, добавьте ключевое слово в список выборки.
В терминологии Oracle ROWID называется «псевдостолбцом», потому что на самом деле столбца с именем ROWID в таблице не существует. Значение ROWID ближе к указателю — оно содержит физический адрес строки в таблице.
148.2 DBMS_ROWID Types
There are four DBMS_ROWID types.
Extension and restriction types
Extension and Restriction Type
The types are as follows:
RESTRICTED —restricted ROWID
EXTENDED —extended ROWID
Extended ROWIDs are only used in Oracle database version 8.X i and higher.
Object Number not defined (for restricted ROWIDs )
Convert to/from column of ROWID type
Convert to/from string format
Числовые типы данных PL/SQL
PL/SQL поддерживает все более широкое множество числовых типов данных. Долгие годы рабочей лошадкой числовых типов данных был тип NUMBER, который можно использовать для десятичных значений с фиксированной и плавающей точкой, а также для целых значений. Приведем несколько примеров объявлений типа NUMBER:
Десятичная природа типа NUMBER оказывается чрезвычайно полезной при работе с денежными величинами. Вам не придется беспокоиться о возможных ошибках округления при переводе числа в двоичное представление. Например, записывая число 0.95, не стоит бояться, что от него через некоторое время останется только 0.949999968.
До выпуска версии Oracle Database 10g тип NUMBER был единственным числовым типом данных PL/SQL, полностью соответствующим типу данных базы данных. Это одна из причин столь широкого использования типа NUMBER. В Oracle Database 10g появилось еще два двоичных типа с плавающей точкой: BINARY_FLOAT и BINARY_DOUBLE. Как и NUMBER, оба новых типа поддерживаются как в PL/SQL, так и в базе данных. Правильно применяя их, можно добиться значительного повышения производительности за счет того, что математические операции над новыми типами выполняются аппаратной частью (когда это позволяет аппаратная платформа).
Язык программирования PL/SQL поддерживает ряд числовых типов и подтипов, которые не соответствуют типам базы данных, но, тем не менее, весьма полезны. Упомянем особо PLS_INTEGER, целочисленный тип, для которого арифметические операции выполняются аппаратно. Счетчики циклов FOR реализованы типом PLS_INTEGER.
148.1 DBMS_ROWID Security Model
This package runs with the privileges of calling user, rather than the package owner SYS .
148.5 DBMS_ROWID Examples
This example returns the ROWID for a row in the EMP table, extracts the data object number from the ROWID , using the ROWID_OBJECT function in the DBMS_ROWID package, then displays the object number:
Дата, время и интервалы
До появления версии Oracle9i представление дат в Oracle ограничивалось типом DATE , в котором хранится дата и время (с округлением до ближайшей секунды). В Oracle9i были введены два новых типа данных, INTERVAL и TIMESTAMP , значительно расширившие возможности разработчиков в отношении операций с датами и временем в PL/ SQL, а также вычисления и хранения временных интервалов. Их использование продемонстрировано в функции, вычисляющей возраст человека в интервальном формате с точностью до месяца:
Читайте также: