
- •Конспект лекций
- •1.4. Стандартные процедуры и функции
- •1.5. Процедуры вывода
- •1.6. Таблицы учебной база данных
- •2. Простые типы данных
- •2.1. Числовые типы
- •2.2. Символьные типы данных
- •2.3. Тип данных даты-времени
- •2.4. Преобразование типов
- •2.5. Порядок вычисления выражений
- •3. Типы команд языка sql
- •3.1. Команды обработки данных
- •3.1.1. Извлечение данных с помощью запросов
- •3.1.2. Вставка, обновление и удаление строк в таблицах
- •3.2. Управление транзакциями
- •3.2.1. Подтверждение транзакций
- •3.2.2. Откат транзакций
- •3.3. Команды определения данных
- •3.3.1. Таблицы
- •3.3.2. Последовательности
- •3.3.3. Представления
- •3.3.4. Синонимы
- •3.4. Команды управления данными
- •4. Управление привилегиями
- •4.1. Понятие привилегии
- •4.2. Типы привилегий
- •4.3. Системные привилегии
- •4.4. Объектные привилегии
- •4.5. Роли
- •4.5.1. Создание ролей
- •4.5.2. Изменение ролей
- •5.1. Блочная структура программ
- •5.2. Раздел declare
- •5.3. Раздел begin-end
- •5.4. Раздел exception
- •6. Простые типы данных pl/sql
- •6.1. Числовые типы
- •6.2. Символьные типы данных
- •6.2.1. Символьные типы фиксированной длины
- •6.2.2. Символьные типы переменной длины
- •6.3. Тип данных даты-времени
- •6.4. Логический тип данных
- •6.5. Тип данных %type
- •6.6. Преобразование типов
- •6.6.1. Явное преобразование типов
- •6.6.2. Неявное преобразование типов
- •6.7. Порядок вычисления выражений
- •Вопросы для самоконтроля
- •7. Операторы языка pl/sql
- •7.1. Оператор присваивания
- •7.2. Составной оператор
- •7.3. Условный оператор
- •7.4. Оператор выбора case
- •7.5. Оператор простого цикла (цикл loop)
- •7.6. Оператор цикла с параметром (цикл for)
- •7.7. Оператор цикла с предусловием (цикл while)
- •7.8. Оператор перехода goto
- •Вопросы для самоконтроля
- •8. Работа с базами данных
- •8.1. Выборка данных
- •8.2. Курсоры
- •8.2.1. Создание и работа с курсорами
- •Cursor c_sal is
- •Cursor c_sal is
- •Cursor c_sal is
- •8.2.2. Курсорные атрибуты
- •8.2.3. Параметры курсора
- •8.2.4. Курсорный цикл for
- •8.3. Изменение данных в таблицах
- •8.4. Транзакции
- •9. Хранимые подпрограммы pl/sql
- •9.1. Процедуры
- •9.2. Функции
- •9.3. Пакеты
- •9.4. Области действия и область видимости переменных
- •9.5. Параметры процедур и функций
- •Вопросы для самоконтроля
- •10. Стандартные пакеты pl/sql
- •10.1. Пакет dbms_output
- •11. Интегрированная среда Oracle 10g xe
- •11.1 Как начать работу с Oracle 10g xe
- •11.2 Ваша первая программа
9.4. Области действия и область видимости переменных
Область действия переменных – это фрагмент программы, в котором возможно обращение к этой переменной. Для переменной PL/SQL – это фрагмент с момента ее объявления и до конца блока. Это показано в следующем примере.
DECLARE -- начало внешнего блока
A number;
BEGIN
DECLARE -- начало внутреннего блока
B number;
BEGIN
END; -- конец внутреннего блока
END; -- конец внешнего блока
Здесь переменная A имеет область действия и во внешнем блоке и во внутреннем. Для переменной B областью действия является только внутренний блок.
Область видимости переменной – это фрагмент программы, в котором возможно обращение к этой переменной без дополнительных квалификаторов. Область видимости всегда лежит в пределах области действия; если переменная находится вне области своего действия, она невидима. Рассмотрим следующий пример.
DECLARE -- начало внешнего блока
A number;
C date;
BEGIN -- 1
DECLARE -- начало внутреннего блока
B number;
C char(2);
BEGIN -- 2
END; -- конец внутреннего блока
-- 3
END; -- конец внешнего блока
В этой программе в точке 1 видимы переменные A и C типа date. В точке 2 видимы переменные A, B и C типа char(2), а переменная C типа date не видна хотя и находится в области своего действия. Дело в том, что объявленная во внутреннем блоке переменная C (т.е. переменная с таким же именем) перекрывает видимость переменной C, определенной во внешнем блоке. В точке 3 видимы переменные A и C типа date, которая снова становится видна, т.к. закончилась область действия переменной C типа char(2).
Если переменная находится в своей области действия, но не видна – то как обратиться к ней в программе? Рассмотрим пример, в котором программа из предыдущего примера несколько изменена.
<<bl_outer>>
DECLARE -- начало внешнего блока
A number;
C date;
BEGIN -- 1
DECLARE -- начало внутреннего блока
B number;
C char(2);
BEGIN -- 2
END; -- конец внутреннего блока
-- 3
END; -- конец внешнего блока
В этой программе внешний блок является помеченным меткой bl_outer. Используя эту метку перед переменной, можно во внутреннем блоке обратиться к переменной C типа date – благодаря использованию метки она становится видна..
9.5. Параметры процедур и функций
Параметры процедур и функций могут быть разного вида, и их разрешается передавать по значению или по ссылке.
Таблица 1. Виды параметров
Вид |
Описание |
IN |
Значение фактического параметра передается в процедуру при ее вызове. Внутри процедуры формальный параметр рассматривается в качестве константы PL/SQL – параметра только для чтения – и не может быть изменен. Когда процедура завершается и управление программой возвращается в вызывающую среду, фактический параметр не изменяется. |
OUT |
Любое значение, которое имеет фактический параметр при вызове процедуры, игнорируется. Внутри процедуры формальный параметр рассматривается как неинициированная переменная PL/SQL, то есть содержит NULL-значение, и можно как записать в него значение, так и считать значение из него. Когда процедура завершается и управление программой возвращается в вызывающую среду, содержимое формального параметра присваивается фактическому параметру (в Oralce 8i этот режим можно изменить с помощью модификатора NOCOPY, позволяющего применять параметр по ссылке). |
IN OUT |
Этот вид представляет комбинацию видов IN и OUT. Значение фактического параметра передается в процедуру при ее вызове. Внутри процедуры формальный параметр рассматривается в качестве инициализированной переменной, и можно как записать в него значение, так и считать значение из него. Когда процедура завершается и управление программой возвращается в вызывающую среду, содержимое формального параметра присваивается фактическому параметру (в Oralce 8i этот режим можно изменить с помощью модификатора NOCOPY, как и для параметра OUT). |
При описании процедур запрещается указывать длину параметров типа CHAR и VARCHAR2, а также точность и/или масштаб параметров типа NUMBER, поскольку ограничения принимаются от фактических параметров. Единственным способом наложить ограничения на формальные параметры является использование атрибута %TYPE. В этом случае ограничение распространяется не на фактический параметр, а на формальный.
CREATE OR REPLACE PROCEDURE myProc
(p_Par1 IN OUT cust.rating%TYPE,
p_Par2 OUT VARCHAR2 DEFALT NULL) IS
BEGIN
p_Par1 := 250;
END myProc;
/
Даже если вызвать процедуру myProc с фактическим параметром другой точности, то будет использоваться точность формального параметра.
Считывание данных из параметра OUT нельзя в Oracle версий, предшествующих Oracle 8i v.8.0.4 (за исключением v 7.3.4).
Если в процедуре или функции нет параметров, то не нужно указывать круглые скобки ни в объявлении подпрограммы, ни в ее вызове.
При вызове подпрограмм с параметрами можно использовать как позиционное представление, так и именное. Позиционное представление используется наиболее часто, и в этом случае параметры перечисляются в том порядке, в каком они описываются в процедуре:
CREATE OR REPLACE PROCEDURE Proc_1 IS
nRtg NUMBER (4) := 120;
vVal VARCHAR(20) := ‘Tokyo’;
BEGIN
MyProc(nRtg, vVal);
END myProc;
/
При именованном представлении для каждого аргумента указывается как формальный, так и фактический параметры. Это позволяет при желании установить собственный порядок аргументов.
CREATE OR REPLACE PROCEDURE Proc_1 IS
nRtg NUMBER (4) := 120;
vVal VARCHAR(20) := ‘Tokyo’;
BEGIN
MyProc(p_Par2 => vVal, p_Par1 => nRtg);
END myProc;
/