Шаг 45 - PL/SQL - DDL, DML и еще кое что

Замечательно, мы знаем уже почти все типы данных, умеем делать исполняемые блоки и много уже чего. Здорово!

Пришло наконец время поближе познакомится с такими понятиями как язык манипулирования данными - DML (Data manipulation language) и языком определения данных - DDL (Data definition language). Все эти понятия лежат в контексте SQL внутри PL/SQL. Так как PL/SQL является расширением стандартного SQL, то собственно все становится ясно. Из всех операторов SQL в программах на PL/SQL можно использовать только DML операторы, сразу скажу, что к ним относятся SELECT, INSERT, UPDATE, DELETE. Операторы DDL за редким исключением использовать нельзя! Для того, чтобы объяснить смысл этих ограничений рассмотрим принцип создания программ PL/SQL.

В любом языке программирования, есть такое понятие как привязка переменных. Она может быть ранней или поздней. Привязка (binding) - переменной, это процесс указания области памяти, соответствующий идентификатору этой переменной. То есть, определен - указана область памяти, где находится определение. Так же PL/SQL, в процесс привязки входит (вот здесь внимательно!) - так же проверка БД на наличие полномочий, позволяющих обращаться к объектам схем (пользователей)! Так как это не просто программирование, а работа в сложном и взаимосвязанном комплексе хранилища данных! :) В языке где используется ранняя привязка (early binding) этот процесс осуществляется на этапе компиляции программы, а в языке, который использует позднюю привязку (late binding) она откладывается до этапа выполнения программы. Ранняя привязка означает, что компиляция программы будет занимать большее количество времени. (так как при этом нужно привязывать переменные), однако выполнятся такая программа будет быстрее! Действительно, привязка завершена. Поздняя привязка сокращает время компиляции, но увеличивает время выполнения программы. При создании PL/SQL было определено, что в нем будет использоваться ранняя привязка переменных, так как все блоки хранятся в памяти (SGA) и вызываются и выполняются максимально быстро! Именно по этому операторы DDL использовать нельзя!!! Оператор DDL модифицирует объект базы данных, следовательно полномочия на объект должны быть подтверждены вновь. Процесс подтверждения полномочий требует привязки идентификаторов, а это уже было сделано во время компиляции! Вот таким образом строится этот процесс. Наверное, вы уже устали от чтения, давайте приведем пример:

BEGIN
	
	CREATE TABLE t_tbl(fld1 VARCHAR2(128));	
	
	INSERT INTO t_tbl(fld1)
		VALUES('Hello World!!!');
		
END;
/

SQL> BEGIN
  2  
  3   CREATE TABLE t_tbl(fld1 VARCHAR2(128));
  4  
  5   INSERT INTO t_tbl(fld1)
  6    VALUES('Hello World!!!');
  7  
  8  END;
  9  /
 CREATE TABLE t_tbl(fld1 VARCHAR2(128));
 *
ошибка в строке 3:
ORA-06550: Строка 3, столбец 2: 
PLS-00103: Встретился символ "CREATE" в то время как ожидалось одно из 
следующих: 
begin case declare exit for goto if loop mod null pragma 
raise return select update while with  
  << 
close current delete fetch lock insert open rollback 
savepoint set sql execute commit forall merge 
 pipe 

Наша программа не отработала должным образом, так как такие операторы не применимы в данном случае. Итак, давайте чуть подробнее рассмотрим основные операторы DDL (Data definition language). Как вы уже наверное поняли, к ним прежде всего относиться оператор создания таблиц - CREATE TABLE, так же оператор DROP TABLE, CREATE VIEW, DROP VIEW, CREATE PROCEDURE, DROP PROCEDURE и т.д. Все это операторы создания объектов БД. Их еще много и рассмотрим мы их с вами по мере изучения материала. Главное, чтобы вы имели представление какая группа операторов к ним относится.

Для начала давайте разберемся с оператором DDL - CREATE TABLE. Собственно он, как не трудно догадаться, используется для создания самого основного объекта БД - таблиц. Общий синтаксис оператора таков:

------- CREATE TABLE -- СХЕМА -- . -- ИМЯ ТАБЛИЦЫ ---- (
------- FIELD1 TYPE FIELD,
------- FIELD2 TYPE FIELD,
		.
		.
		.
------- FIELDn TYPE FIELD
------- );

Сразу смею вас заверить, что это очень упрощенная схема, например, полное описание оператора CREATE TABLE, в руководстве администратора сервера Oracle, занимает три с половиной листа убористого текста. Плюс подробное описание каждой секции, но сейчас это не столь важно. В дальнейшем вы еще успеете познакомиться с оператором DDL, создания таблицы в полном виде. Но для начала, этого достаточно. В шаге 24 мы уже создавали таблицу PEOPLE, если мне не изменяет память, вот такого вида:

CREATE TABLE PEOPLE 
(	ID NUMBER,      
	NM VARCHAR2(50), 
	FAMIL VARCHAR2(50),
	OTCH VARCHAR2(50),
	DROG DATE        
)
/

И даже заполняли ее тремя записями, по моему вот так:

INSERT INTO PEOPLE(ID, NM, FAMIL, OTCH, DROG)
			VALUES(1, 'John', 'Godwin', 'Petrovich', TO_DATE('03-12-1967','DD-MM-YYYY'))
/

INSERT INTO PEOPLE(ID, NM, FAMIL, OTCH, DROG)
			VALUES(2, 'Bob', 'Doris', 'Martovich', TO_DATE('01-02-1960','DD-MM-YYYY'))
/

INSERT INTO PEOPLE(ID, NM, FAMIL, OTCH, DROG)
			VALUES(3, 'Frank', 'Black', 'Milleniumich', TO_DATE('03-07-1953','DD-MM-YYYY'))
/

COMMIT
/

Здесь, я применил внутреннюю функцию TO_DATE, которая преобразует строку в дату по шаблону. Но там я не сказал, как эту таблицу можно не только создать, но и удалить. Оператор DML - INSERT, мы подробнее рассмотрим в следующий раз, а пока давайте поучимся создавать и удалять таблицы БД. Сначала создадим новую таблицу. Введите в SQL*Plus оператор создания таблицы NEWPEOPLE:

CREATE TABLE NEWPEOPLE 
(	
	NM VARCHAR2(50), 
	FAMIL VARCHAR2(50),
	OTCH VARCHAR2(50)
)
/

COMMIT
/

В результате получаем:

SQL> CREATE TABLE NEWPEOPLE
  2  (
  3   NM VARCHAR2(50),
  4   FAMIL VARCHAR2(50),
  5   OTCH VARCHAR2(50)
  6  )
  7  /

Таблица создана.

SQL> 
SQL> COMMIT
  2  /

Фиксация обновлений завершена.

Итак, новая табличка создана с применением оператора DDL - CREATE TABLE. Давайте убедимся, что она действительно создана.

Дадим вот такой запрос:

SELECT a.OBJECT_NAME, a.OBJECT_TYPE, a.STATUS FROM USER_OBJECTS a
WHERE a.OBJECT_TYPE = 'TABLE'
/

Получаем:

SQL> SELECT a.OBJECT_NAME, a.OBJECT_TYPE, a.STATUS FROM USER_OBJECTS a
  2  WHERE a.OBJECT_TYPE = 'TABLE'
  3  /

OBJECT_NAME   OBJECT_TYPE   STATUS
------------- ------------- -------
CUSTOMERS     TABLE         VALID
NEWPEOPLE     TABLE         VALID
OFFICES       TABLE         VALID
ORDERS        TABLE         VALID
PEOPLE        TABLE         VALID
PRODUCTS      TABLE         VALID
SALESREPS     TABLE         VALID

7 строк выбрано.

Хорошо видно, что обе таблицы PEOPLE и NEWPEOPLE находятся в схеме MILLER и в исправном состоянии, о чем свидетельствует запись VALID в поле STATUS. Что ж, теперь давайте удалим обе эти таблицы, так как пока они нам больше не нужны. Для удаления таблиц воспользуемся оператором языка DDL - DROP TABLE:

DROP TABLE PEOPLE
/

DROP TABLE NEWPEOPLE
/

COMMIT
/

После ввода в SQL*Plus получаем:

SQL> DROP TABLE PEOPLE
  2  /

Таблица удалена.

SQL> DROP TABLE NEWPEOPLE
  2  /

Таблица удалена.

SQL> 
SQL> COMMIT
  2  /

Фиксация обновлений завершена.

Вот и все! Таблицы удалены! Но с оператором DROP TABLE советую обращаться осторожнее, не удалите по запарке какую-нибудь важную таблицу! В крайнем случае, воспользуйтесь откатом транзакции, оператор ROLLBACK! Вот, теперь мы умеем создавать и удалять таблицы в схеме БД. Можете пробовать, только пока не удаляйте наши учебные таблички, он нам еще понадобятся!!! :)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 21.10.2003