Лекция: start Имя_файла_процедуры
Если вы что-то ввели неправильно, у вас могут возникнуть ошибки компиляции. К сожалению, SQL*Plus не покажет вам эти ошибки автома тически, а выдаст сообщение «Warning: Procedure created with compilation errors „(Предупреждение: При компиляции процедуры обнаружены ошиб ки). Чтобы увидеть ошибки, введите команду:
Show errors;
Если синтаксических ошибок не было, вы получите сообщение “Procedure created „(Процедура создана). Теперь вы можете вызвать эту процедуру с помощью команды EXECUTE или EXEC:
Exec Customer_Insert('Michael Bench', '203', '555-2014', 'US');
Если возникнут ошибки на этапе выполнения процедуры, номера строк в отчете об ошибках не будут совпадать с номерами строк, которые вы можете видеть в своем текстовом редакторе.
Развитые типы данных Oracle (массив, таблица, объект)
· Массив varray представляет собой коллекцию объектов определённого типа.
SQL> create type
Tax_tp as object(
Year Date
Tax number);
SQL>create type
My_arr as array(3) of Tax_tp;
Объявление массива:
DECLARE
TYPE t_ar IS VARRAY(250) OF VARCHAR(100);
V1 t_ar;
i NUMBER :=0
BEGIN
LOOP
IF (i >= 100) THEN
EXIT;
END IF;
V1(i):=TO CHAR(i);
END LOOP;
END
Типовая заготовка (структура) ХП oracle может быть представлена определённым образом:
Create or replace procedure
имя_процедуры
Is
Declare
…объявление переменных и типов…
Begin
… исполнительный порядок…
Exception
…Обработка исключения…
End имя_процедуры
· Таблицы:
Тип таблиц ближе к массивам, но отличие в том, что каждый элемент таблицы имеет индекс, например, V(-15):=’Mir’. Количество элементов не фиксировано, объявление таблицы:
DECLARE
TYPE t_tab IS TABLE OF VARCHAR(10)
INDEX BY BINARY_INTEGER;
V1 t_tab
BEGIN
V1(-4) = ‘John’
V1(0) = ‘Doe’;
END;
В отличии от массива, в таблице индексы не обязаны последовательно возрастать. Пример с заполнением таблицы:
DECLARE
TYPE t_tab IS TABLE OF Stud %TYPE
INDEX BY BINARY INTEGER;
V1.t_tab
BEGIN
SELECT * INTO V1(-2)
FROM stud
WHERE Id = -2
END;
В таблице и массиве есть ряд доступных свойств: COUNT, FIRST, LAST, NEXT, DELETE(10) (удаление строки с индексом 10), DELETE(10,200) (удаление записи из диапазона от 10 до 200). Пример:
DECLARE
TYPE t_tab IS TABLE OF stud.FN%TYPE
INDEX BY BINARY_INTEGER;
FNAMES t_tab;
BEGIN
FNAMES(1):=’John’;
FNAMES(3):=’Doe’;
IF FNAMES.EXISTS(1) THEN FNAMES.DELETE(1)
END IF;
END
· Курсоры:
Declare
Cursor ordc is
Select * from Orders;
Cursor get_Orditem(prom_num orders.ord_num % type) is
Select quantity
From orders where ord_num = prod.num;
Пример работы с курсорами:
DECLARE
V_stud students.IO%TYPE;
V_FirstName students.FirstName%TYPE;
V_Depart students.Department%TYPE:=”Computer Science”;
CURSOR c_Students IS
SELECT id, FirstName
FROM students
WHERE Department=V_Depart
Begin
Open c_Students;
LOOP
FETCH c_Students INTO V_stud, v_FirstName
EXIT WHEN
C_Students% NOT FOUND;
END LOOP
CLOSE c_Students;
END;
Пример с курсорными переменными:
DECLARE
TYPE L_classes IS REF CURSOR
Return classes%ROWTYPE
V_c1 c_Classes;
Open v_c1 FOR
SELECT * FROM Classes;
REF – ссылка на курсор; V_c1 – курсорная переменная.
Пример с функцией:
CREATE OR REPLACE FUNCTION MyFun (x IN BOOLEN)
RETURN VARCHAR2
IS
DECLARE
Str VARCHAR(5);
Begin
IF (x) THEN
Str:=”TRUE”;
ELSE
Str:=”FALSE”;
ENDIF
RETURN(Str);
END MyFun
Также имеется большое количество встроенных функций, таких как CHR(x) (возврат символа в формате ASCII), CONCAT(s1,s2) (Объединение строк), SUBSTR(s,n1,n2) (выделение в строке S n2 символов начиная с n1) и так далее.