Конспект лекций по дисциплине «Сетевые базы данных», страница 26

DECLARE

CURSOR c_cust(p_city VARCHAR2) IS

SELECT * FROM cust WHERE city=p_city;

BEGIN

v_city := 'London';

FOR v_cust IN c_cust(v_city) LOOP

DBMS_OUTPUT.PUT_LINE(v_cust.cname||' has '||v_cust.rating);

END LOOP;

END;

/

В тех случаях, когда оператор SELECT достаточно прост, курсорный цикл может иметь еще более компактный вид:

BEGIN

FOR v_sal IN (SELECT sname,comm FROM sal) LOOP

DBMS_OUTPUT.PUT_LINE(v_sal.sname||' has '||v_sal.comm);

END LOOP;

END;

/

Компактность, как видно из примера, достигается за счет того, что отдельного объявления курсора не требуется.

            8.3. Изменение данных в таблицах

Команды изменения данных (INSERT, UPDATE и DELETE) имеют в PL/SQL точно такой же синтаксис, как и в SQL. Добавляется только возможность использовать переменные наряду с  полями таблиц и литералами. В приведенной ниже программе используются те же примеры, что и п. 3.1.2, но в командах вместо явного указания некоторых значений используются переменные.

DECLARE

vName varchar2(20) := ‘Tom’’;

vNum   number := 1001;

vAmt    number := 100;

BEGIN

INSERT INTO sal

VALUES (1008, vName, NULL, NULL)

UPDATE cust  SET rating=rating + 50

WHERE snum = vNum;

DELETE FROM ord WHERE amt <= vAmt;

END;

/

Обратите внимание на то, как определены переменные в разделе DECLARE – им присвоены начальные значения.

            8.4. Транзакции

Понятие транзакции в PL/SQL остается таким же, как и SQL (см. п. 3.2). ТРАНЗАКЦИЯ - это логическая единица работы, составленная из одной или нескольких команд SQL. Транзакция - это атомарная единица; результаты всех команд SQL, составляющих транзакцию, должны быть либо все ПОДТВЕРЖДЕНЫ (применены к базе данных), либо все ОТМЕНЕНЫ. Транзакции должны состоять лишь из тех команд SQL, которые в совокупности осуществляют одно согласованное изменение данных.

Транзакция начинается с первой выполняемой команды SQL. Транзакция заканчивается, когда она либо подтверждается, либо отменяется, что может быть сделано явно (командами COMMIT или ROLLBACK) или неявно (когда выдается команда DDL).

Следует добавить, что в PL/SQL транзакция неявно подтверждается, если программа (не содержащая команды COMMIT) завершилась успешно. Транзакция неявно отменяется, если программа (не содержащая команды ROLLBACK) завершилась аварийно.

Вопросы для самоконтроля

8.1.  В каких случаях для выбора данных из БД можно использовать команду SELECT … INTO?

8.2.  Для чего используется фраза INTO в команде SELECT … INTO?

8.3.  Что такое курсор?

8.4.  Чем отличается явный курсор от неявного?

8.5.  Какая из команда выбора определяется в явном курсоре – SELECT или SELECT … INTO?

8.6.  Какие атрибуты курсора вам известны?

8.7.  Какой используется оператор для перемещения данных из курсора в переменные программы?

8.8.  Можно ли использовать явный курсор для команды UPDATE?

8.9.  В каких случаях используется неявный курсор для команды SELECT … INTO?

8.10.  Можно ли использовать курсорный цикл FOR без определения явного курсора?

9. Хранимые подпрограммы PL/SQL

Процедуры, функции и пакеты являются именованными блоками, хранящимися в базе данных. Их часто называют единым термином – хранимые процедуры. Они являются объектами базы данных и, как и все объекты БД, имеют имена. Хранимые процедуры могут иметь входные и выходные параметры и могут вызываться из других программ. Как и все другие объекты БД, процедуры, функции и пакеты создаются командой CREATE, а удаляются командой DROP.

            9.1. Процедуры

Синтаксис команды создания процедур следующий:

CREATE [OR REPLACE] PROCEDURE имя_процедуры