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 имя_процедуры
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.