SQL Plus: Создание и выполнение сценариев - Связываемые переменные
ОГЛАВЛЕНИЕ
Связываемые переменные
Связываемые переменные - это создаваемые в SQL*Plus переменные, на которые можно ссылаться (как на хост-переменные) в блоках PL/SQL. Таким переменным можно, например, присваивать значения в блоках PL/SQL или использовать их значения во включенных в блоки SQL-операторах. Значения связываемых переменных можно затем выдавать в SQL*Plus.
Команда VARIABLE
Для создания связываемой переменной используется команда VARIABLE со следующим синтаксисом:
- <команда VARIABLE> ::=
- VAR[IABLE] [<имя переменной> [<тип данных>]]
- <тип данных> ::=
- NUMBER
/ CHAR [(<количество> [<единица измерения>])]
/ NCHAR [(<количество>)]
/ VARCHAR2 (<количество> [<единица измерения>])
/ NVARCHAR2 (<количество>) / CLOB
/ NCLOB
/ REFCURSOR - <единица измерения> ::=
- CHAR / BYTE
При вызове без параметров команда VARIABLE выдает список всех переменных, созданных в сеансе. Если указать только имя переменной, выдается информация только об этой переменной.
Связываемые переменные можно использовать как параметры хранимых процедур или непосредственно, в анонимных PL/SQL-блоках. Их нельзя использовать в команде COPY или присвоить им значение в SQL-операторах, не входящих в PL/SQL-блоки. Вместо связанной переменной, не получившей явно значения, при необходимости подставляется значение NULL.
Рассмотрим простой пример использования связываемых переменных:
SQL> var
SP2-0568: Не объявлены переменные привязки.
SQL> var dep number
SQL> begin
2 select deptno into :dep from emp
3 where sal = (select max(sal) from emp);
4 end;
SQL> /
Процедура PL/SQL успешно завершена.
SQL> select * from dept where deptno = :dep;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
SQL> var dep2 number
SQL> c /:dep/:dep2
1* select * from dept where deptno = :dep2
SQL> /
строки не выбраны
SQL> var
переменная dep
тип данных NUMBER
переменная dep2
тип данных NUMBER
Мы использовали связываемую переменную для передачи значения из одного оператора SQL в другой, так и не выдав его на экран. Чтобы значения используемых в команде связываемых переменных выдавались автоматически, необходимо выполнить команду SET AUTOPRINT ON.
Типы данных для связываемых переменных аналогичны соответствующим типам данных PL/SQL. Переменные типа REFCURSOR позволяют работать с курсорными переменными PL/SQL. Утилита SQL*Plus обрабатывает связываемые переменные такого типа особым образом. Курсор, соответствующий курсорной переменной, открывается явно, а закрывается после выдачи значения или при завершении сеанса. При выдаче значения на экран выдается результирующее множество соответствующего запроса. Рассмотрим пример:
SQL> set autoprint on
SQL> var a refcursor;
SQL> begin
2 open :a for select * from dept;
3 end;
4 /
Процедура PL/SQL успешно завершена.
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 TRAINING KIEV
SQL> exec open :a for select ename, sal from emp where deptno = :dep;
Процедура PL/SQL успешно завершена.
DEP
----------
10
ENAME SAL
---------- ----------
CLARK 2450
KING 5000
MILLER 1300
Результаты, выдаваемые при показе значений связываемой переменной типа REFCURSOR можно форматировать так же, как и результаты выполнения SQL-оператора SELECT. Значение такой переменной выдается только один раз, - затем результирующее множество надо выбирать повторно.
Для явной выдачи на экран значения связываемой переменной используется команда PRINT.
Команда PRINT
Команда PRINT имеет следующий синтаксис:
- <команда PRINT> ::=
- PRI[NT] { <имя переменной>}
Эта команда выдает текущее значение перечисленных связываемых переменных. При вызове без параметров выдаются значения всех связываемых переменных.
Продолжая предыдущий пример:
SQL> print a
SP2-0625: Ошибка печати переменной "a"
SQL> print
DEP
----------
10
DEP2
----------
SP2-0625: Ошибка печати переменной "a"
SQL> set autoprint off
SQL> exec open :a for select ename,sal,comm from emp where deptno=:dep;
Процедура PL/SQL успешно завершена.
SQL> print dep a
DEP
----------
10
ENAME SAL COMM
---------- ---------- ----------
CLARK 2450
KING 5000
MILLER 1300