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