Параметрическое выражение

Функция

Определение выражения, включающего формальные параметры.

Спецификация
<​параметрический операнд​>::=
литерал | параметр | встроенная функция
<​арифметический оператор​>::=
<​сложение​>::=
+
<​вычитание​>::=
-
<​умножение​>::=
*
<​деление​>::=
/
Синтаксические правила
  1. Применение <​параметрического выражения​> допускается в следующих конструкциях:

    • <​предикат сравнения​>;

    • <​интервальный предикат​>;

    • <​предикат вхождения​>;

    • <​предикат подобия​>;

    • <​WHERE-спецификация​>;

    • <​GROUP BY-спецификация​>;

    • <​HAVING-спецификация​>;

    • <​запрос выборки​>;

    • <​запрос удаления​>;

    • <​запрос добавления​>;

    • <​запрос корректировки​>;

    • <​спецификация типа​>;

    • <​выбор значения по условию​>;

    • <​выполнение процедуры​>;

    • встроенные функции.

  2. <​Параметрическое выражение​> может использоваться в любом месте, где синтаксические правила допускают значение <​литерала​> в соответствующем интерактивном варианте.

    Примечание

    Из данного ограничения следует, что параметр не может представлять явно или косвенно имена объектов БД (например, явные имена таблицы, столбца, представления, синонима, роли и т.п. или номера столбцов сортировки в конструкции ORDER BY).

  3. В тех случаях, когда из контекста нельзя установить тип параметра, например, в выражении ? + ?, необходимо явное указание типов параметров.

  4. Если результат подзапроса вставляется в таблицу, то параметры подзапроса по умолчанию получают тип данных соответствующих столбцов этой таблицы.

    create or replace table test (i int, c char(20));
    insert into test(i,c) select ?, make from auto where rowid=100;
    Параметр 1 (INTEGER)​>
  5. Одноименные параметры должны иметь совпадающие типы данных.

    Корректная конструкция, т.к. make и model имеют один и тот же тип char(20):

    select * from auto where make=:m and model=:m;

    Некорректная конструкция, т.к. bodytype имеет другой тип char(15):

    select * from auto where make=:m and bodytype=:m;

    Корректная конструкция:

    select * from auto where make=:m and bodytype=:m(char(20));
  6. Конструкция CAST ? AS <​тип данных​> эквивалентна конструкции ? (<​тип данных​>).

  7. Значения <​неименованных параметров​> подставляются в SQL-оператор в порядке их следования в этом операторе.

  8. <​Параметры​> должны иметь тип данных, совпадающий с типом данных соответствующих им <​значимых выражений​>, или приводиться к нему.

  9. В конструкции вида <​значение​>||<​параметр​> тип параметра по умолчанию приводится к типу значения.

  10. Параметр, для которого задан строковый тип без явного указания длины, считается имеющим длину 1 (2 для UNICODE).

  11. Разрешена конструкция INTO для задания выходных параметров в <​запросе выборки​>:

    <​запрос выборки​> ::=
      SELECT [ALL | DISTINCT] <​список выборки​>
      INTO <​параметр​> [,<​параметр​>….] <​табличное выражение​>
  12. Количество <​параметров​> в <​запросе выборки​> должно совпадать с количеством элементов в <​списке выборки​>. В <​списке выборки​> можно использовать <​параметрическое выражение​>, содержащее, по крайней мере, один <​литерал​>.

  13. Разрешена конструкция INTO для указания параметра, в который помещается результат выполнения хранимой процедуры (значение, передаваемое оператором RESULT процедурного языка):

    EXECUTE INTO <​параметр​> <​имя хранимой процедуры​> (<​аргумент​> [,<​аргумент​> ….])
Примеры
select make from auto where 1900+year=1900+:year;

select make from auto where year​>?;

select make from auto where year between :beg_year and :end_year;

select make from auto where year in ( ?, ?, ?);

select make from auto where make like 'FO'+?(char(2));

select make from auto where make=:make or make like ?;

select make, count(*) from auto group by make having count(*)​>:year;

select distinct make,year into ?,? from auto where ?(char(4))= make;

select distinct 'MODEL:'+:make(char(10)), year into ?(char(10)),?(int)
  from auto where ?(char(4))= make;

select substr( model,1,?(int)) into ? from auto where ?(char(4))= make;

update auto join person set auto.make=?(char(4))
 where auto.personid=person.personid
   and person.salary between :sum1 and :sum2;

select cast ? as smallint from auto; // не допустимо

select cast 0+? as smallint from auto;

select cast ? (int) as smallint from auto;

select distinct make,model from auto
 where make = case cylnders when : num_cyl(int) then upper(:if_make(char(10)))
                            else upper(:else_make(char(10))) end;

execute into :result saldo(?,?);

insert into auto( personid,make,year,model) values (?,:make,:year,:model);

insert into auto( personid,make,year,model) values (?,:make,:year,:model+cast(:p(int) as char(20))));

delete from auto where year<​= ?;

select dt1,dt2 from table1 where :1 BETWEEN DT1 AND DT2;

select distinct 'MODEL:'+:make(char(10)),year into ?(char(10)),?(int) from auto where ?(char(4))= make;

select abs(?-?);

select (case when (t1.currency = ?) then (t1.amount) else (?) end) p1 from db1_transaction t1;