Выпуск 24
Синтаксис: создаем индексы, хранимый Java-объект и библиотеку
Уважаемые подписчики! Это очередной авторский выпуск, посвященный формальному синтаксису. Мы продолжаем
разбирать операторы CREATE, по алфавиту. По ходу дела также - синтаксис конструкции хранения, задающей параметры для сегментов. Синтаксис представлен в виде
расширенных формул Бэкуса-Наура для версии сервера 9.0.1.
Оператор CREATE INDEX
Создание индекса по столбцам таблицы, в том числе, фрагментированной и
организованной по индексу, по столбцам кластера, по скалярным атрибутам объектной
таблицы или кластера, а также по столбцам физической таблицы, обеспечивающей хранение
вложенных таблиц.
- <оператор CREATE INDEX> ::=
-
CREATE [<тип индекса>] INDEX [<схема>.]<имя индекса>
ON <кластер, таблица или соединение>;
- <тип индекса> ::=
-
UNIQUE | BITMAP
- <кластер, таблица или соединение> ::=
-
<ссылка на кластер>
| <ссылка на таблицу>
| <конструкция битового индекса для соединения>
- <ссылка на кластер> ::=
-
CLUSTER [<схема>.]<имя кластера> <атрибуты индекса>
- <ссылка на таблицу> ::=
-
[<схема>.]<имя таблицы> [<псевдоним>]
(<элемент индекса> {, <элемент индекса>}) <особенности индекса>
- <элемент индекса> ::=
-
<индексируемое выражение> [<порядок сортировки>]
- <индексируемое выражение> ::=
-
<имя столбца> | <выражение над столбцами>
- <порядок сортировки> ::=
-
ASC | DESC
- <особенности индекса> ::=
-
<прикладной индекс>
| [<глобальный или локальный индекс>] <атрибуты индекса>
- <прикладной индекс> ::=
-
INDEXTYPE IS <тип индекса> [PARALLEL] [PARAMETERS ('<строка>')]
- <глобальный или локальный индекс> ::=
-
<глобальный индекс> | <локальный индекс>
- <глобальный индекс> ::=
-
GLOBAL [PARTITION BY RANGE (<список столбцов>)
(<фрагмент по диапазону>{, <фрагмент по диапазону>})]
- <фрагмент по диапазону> ::=
-
PARTITION [<имя фрагмента>] VALUES LESS THAN
(<значение>{, <значение>}) {<атрибут сегмента>}
- <список столбцов> ::=
-
<имя столбца>{, <имя столбца>}
- <атрибут сегмента> ::=
-
<физический атрибут>
| TABLESPACE <имя табличного пространства>
| <журнализация>
- <локальный индекс> ::=
-
LOCAL [<локальная фрагментация индекса>]
- <локальная фрагментация индекса> ::=
-
<по таблице, фрагментированной по диапазону>
| <по таблице, фрагментированной по списку>
| <по таблице, фрагментированной по хеш-функции>
| <по таблице с составной фрагментацией>
- <по таблице, фрагментированной по диапазону> ::=
-
(<фрагмент индекса>{, <фрагмент индекса>})
- <фрагмент индекса> ::=
-
PARTITION [<имя фрагмента> {<атрибут сегмента>}]
- <по таблице, фрагментированной по списку> ::=
-
(<фрагмент индекса>{, <фрагмент индекса>})
- <по таблице, фрагментированной по хеш-функции> ::=
-
STORE IN (<табличные пространства>)
| (<спецификация фрагмента>{, <спецификация фрагмента>)
- <табличные пространства> ::=
-
<имя табличного пространства>{, <имя табличного пространства>}
| DEFAULT
- <спецификация фрагмента> ::=
-
PARTITION [<имя фрагмента> [TABLESPACE <имя табличного пространства>]]
- <по таблице с составной фрагментацией> ::=
-
STORE IN (<табличные пространства>)
[(<спецификация составного фрагмента>
{,<спецификация составного фрагмента>})]
- <спецификация составного фрагмента> ::=
-
PARTITION [<имя фрагмента> {<атрибут сегмента>}
[<подфрагменты индекса>]]
- <подфрагменты индекса> ::=
-
STORE IN (<табличные пространства>)
| (<подфрагмент индекса>{, <подфрагмент индекса>})
- <подфрагмент индекса> ::=
-
SUBPARTITION [<имя подфрагмента>
[TABLESPACE <имя табличного пространства>]]
- <конструкция битового индекса для соединения> ::=
-
[<схема>.]<имя таблицы> (<столбец соединения>{, <столбец соединения>})
FROM [<схема>.]<имя таблицы>{, [<схема>.]<имя таблицы>}
WHERE <условие> [<локальный индекс>] <атрибуты индекса>
- <атрибуты индекса> ::=
-
{<атрибут индекса>}
- <атрибут индекса> ::=
-
{<физический атрибут>}
| <журнализация>
| ONLINE
| COMPUTE STATISTICS
| TABLESPACE <пространство>
| <сжатие>
| <сортировка>
| <параллелизм>
- <физический атрибут> ::=
-
PCTFREE <целое число>
| PCTUSED <целое число>
| INITRANS <целое число>
| MAXTRANS <целое число>
| <конструкция хранения>
- <журнализация> ::=
-
LOGGING | NOLOGGING
- <пространство> ::=
-
<имя табличного пространства> | DEFAULT
- <сжатие> ::=
-
COMPRESS <целое число> | NOCOMPRESS
- <сортировка> ::=
-
NOSORT | REVERSE
- <параллелизм> ::=
-
NOPARALLEL | PARALLEL [<целое число>]
Конструкция хранения задается для сегментов индекса, таблицы, кластера, дополнительного сегмента таблицы,
организованной по индексу и т.д. Мы будем еще много раз ссылаться на эту конструкцию в описаниях синтаксиса.
- <конструкция хранения> ::=
-
STORAGE (<особенность хранения> {<особенность хранения>})
- <особенность хранения> ::=
-
INITIAL <целое число> [<единица измерения>]
| NEXT <целое число> [<единица измерения>]
| MINEXTENTS <целое число>
| MAXEXTENTS <количество экстентов>
| PCTINCREASE <целое число>
| FREELISTS <целое число>
| FREELIST GROUPS <целое число>
| OPTIMAL [<оптимальный размер>]
| BUFFER_POOL <особенность использования пула>
- <единица измерения> ::=
-
K | M
- <количество экстентов> ::=
-
<целое число> | UNLIMITED
- <оптимальный размер> ::=
-
NULL | <целое число> [<единица измерения>]
- <особенность использования пула> ::=
-
KEEP | RECYCLE | DEFAULT
- Создание глобально фрагментированного индекса (пример Тома Кайта)
tkyte@TKYTE816> CREATE TABLE partitioned
2 (timestamp date,
3 id int
4 )
5 PARTITION BY RANGE (timestamp)
6 (
7 PARTITION part_1 VALUES LESS THAN
8 (to_date('01-jan-2000','dd-mon-yyyy')),
9 PARTITION part_2 VALUES LESS THAN
10 (to_date('01-jan-2001','dd-mon-yyyy'))
11 )
12 /
Table created.
tkyte@TKYTE816> create index partitioned_index
2 on partitioned(id)
3 GLOBAL
4 partition by range(id)
5 (
6 partition part_1 values less than(1000),
7 partition part_2 values less than (MAXVALUE)
8 )
9 /
Index created.
- Локально фрагментированный индекс на основе битовых карт, с конструкцией хранения
CREATE BITMAP INDEX partno_ix
ON lineitem(partno)
TABLESPACE ts1
LOCAL (PARTITION quarter1 TABLESPACE ts2,
PARTITION quarter2 STORAGE (INITIAL 10K NEXT 2K),
PARTITION quarter3 TABLESPACE ts2,
PARTITION quarter4);
- Индекс по функции
CREATE INDEX income_ix
ON employees(salary + (salary*commission_pct));
- Индекс со сжатием первого столбца
CREATE INDEX ord_customer_ix ON orders (customer_id, sales_rep_id)
COMPRESS 1;
Оператор CREATE INDEXTYPE
Создание индексного типа - объекта, определяющего набор функций для управления
прикладным (domain) индексом.
- <оператор CREATE INDEXTYPE> ::=
-
CREATE [OR REPLACE] INDEXTYPE [<схема>.]<имя индексного типа>
FOR <оператор индексного типа>{, <оператор индексного типа>}
USING [<схема>.]<реализующий тип>;
- <оператор индексного типа> ::=
-
[<схема>.]<имя оператора> (<тип параметра>{, <тип параметра>})
- Создание индексного типа
CREATE INDEXTYPE TextIndexType
FOR contains (VARCHAR2, VARCHAR2)
USING TextIndexMethods;
Оператор CREATE JAVA
Создание объекта, содержащего исходный текст, класс или ресурс Java.
- <оператор CREATE JAVA> ::=
-
CREATE [OR REPLACE] [AND <дополнительное действие>] [NOFORCE] JAVA
<тип Java-объекта> [<права вызывающего>] [<разрешение имени объекта>]
<код Java-объекта>;
- <дополнительное действие> ::=
-
RESOLVE | COMPILE
- <тип Java-объекта> ::=
-
CLASS [SCHEMA <схема>]
| SOURCE <поименованный объект>
| RESOURCE <поименованный объект>
- <поименованный объект> ::=
-
NAMED [<схема>.]<основное имя>
- <права вызывающего> ::=
-
AUTHID CURRENT_USER | AUTHID DEFINER
- <разрешение имени объекта> ::=
-
RESOLVER (<сопоставление имени> {<сопоставление имени>})
- <сопоставление имени> ::=
-
(<сопоставляемая строка> [,] <схема>)
| (<сопоставляемая строка> [,] -)
- <код Java-объекта> ::=
-
USING <источник текста на Java>
| AS <исходный текст на Java>
- <источник текста> ::=
-
BFILE (<имя каталога>,<имя файла на сервере>)
| <тип большого объекта> <подзапрос>
| '<ключ для большого объекта>'
- <тип большого объекта> ::=
-
CLOB | BLOB | BFILE
- Создание хранимой функции на языке Java для выполнения команд ОС (пример Тома Кайта)
create or replace and compile java source named "Util"
as
import java.io.*;
import java.lang.*;
public class Util extends Object {
public static int RunThis(String[] args) {
Runtime rt = Runtime.getRuntime();
int rc = 1;
try {
Process p = rt.exec(args[0]);
int bufSize = 4096;
BufferedInputStream bis =
new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
rc = p.waitFor();
}
catch (Exception e) {
e.printStackTrace();
rc = -1;
}
finally {
return rc;
}
}
}
/
create or replace function run_cmd(p_cmd in varchar2) return number
as language java
name 'Util.RunThis(java.lang.String[]) return integer';
/
- Создание Java-класса на основе существующего файла
CREATE JAVA CLASS USING BFILE (bfile_dir, 'Agent.class');
- Создание Java-ресурса на основе существующего файла
CREATE JAVA RESOURCE NAMED "appText"
USING BFILE (bfile_dir, 'textBundle.dat');
Оператор CREATE LIBRARY
Создание объекта схемы, соответствующего разделяемой библиотеке операционной системы.
- <оператор CREATE LIBRARY> ::=
-
CREATE [OR REPLACE] LIBRARY [<схема>.]<имя библиотеки><is или as>
'<спецификация файла>' [AGENT '<связь базы данных агента>'];
- <is или as> ::=
-
IS | AS
- Создание библиотеки в ОС UNIX
CREATE LIBRARY ext_lib AS '/OR/lib/ext_lib.so';
- Создание библиотеки в ОС Windows
CREATE LIBRARY stat_lib AS 'c:\tools\stat\stat.dll';
- Создание библиотеки из удаленного источника
CREATE LIBRARY app_lib as '${ORACLE_HOME}/lib/app_lib.so'
AGENT 'cq.profix.com';
В следующем выпуске
Использование нового хранимого пакета DBMS_FLASHBACK Oracle 9i и кое-что про причины
возникновения ошибки ORA-1555 - по мотивам творений Тома Кайта. Следите за новостями на
сайте проекта Open Oracle.
С наилучшими пожеланиями,
В.К.