Доступные версии документации

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

Функция

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

Спецификация
<параметрический операнд>::=
литерал | параметр | встроенная функция
<арифметический оператор>::=
<сложение>::=
+
<вычитание>::=
-
<умножение>::=
*
<деление>::=
/
Синтаксические правила
  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;  
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter