Параметрическое выражение
Функция
Определение выражения, включающего формальные параметры.
Спецификация
::=
::=
::=
::=
::=
::=
Синтаксические правила
-
Применение
< параметрического выражения >
допускается в следующих конструкциях:-
< предикат сравнения >
; -
< интервальный предикат >
; -
< предикат вхождения >
; -
< предикат подобия >
; -
< WHERE-спецификация >
; -
< GROUP BY-спецификация >
; -
< HAVING-спецификация >
; -
< запрос выборки >
; -
< запрос удаления >
; -
< запрос добавления >
; -
< запрос корректировки >
; -
< спецификация типа >
; -
< выбор значения по условию >
; -
< выполнение процедуры >
; -
встроенные функции.
-
-
< Параметрическое выражение >
может использоваться в любом месте, где синтаксические правила допускают значение< литерала >
в соответствующем интерактивном варианте.Примечание
Из данного ограничения следует, что параметр не может представлять явно или косвенно имена объектов БД (например, явные имена таблицы, столбца, представления, синонима, роли и т.п. или номера столбцов сортировки в конструкции
ORDER BY
). -
В тех случаях, когда из контекста нельзя установить тип параметра, например, в выражении
? + ?
, необходимо явное указание типов параметров. -
Если результат подзапроса вставляется в таблицу, то параметры подзапроса по умолчанию получают тип данных соответствующих столбцов этой таблицы.
create or replace table test (i int, c char(20)); insert into test(i,c) select ?, make from auto where rowid=100; Параметр 1 (INTEGER) >
-
Одноименные параметры должны иметь совпадающие типы данных.
Корректная конструкция, т.к. 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));
-
Конструкция
CAST ? AS < тип данных >
эквивалентна конструкции?
(< тип данных >
). -
Значения
< неименованных параметров >
подставляются в SQL-оператор в порядке их следования в этом операторе. -
< Параметры >
должны иметь тип данных, совпадающий с типом данных соответствующих им< значимых выражений >
, или приводиться к нему. -
В конструкции вида
< значение >||< параметр >
тип параметра по умолчанию приводится к типу значения. -
Параметр, для которого задан строковый тип без явного указания длины, считается имеющим длину 1 (2 для UNICODE).
-
Разрешена конструкция
INTO
для задания выходных параметров в< запросе выборки >
:< запрос выборки > ::= SELECT [ALL | DISTINCT] < список выборки > INTO < параметр > [,< параметр >….] < табличное выражение >
-
Количество
< параметров >
в< запросе выборки >
должно совпадать с количеством элементов в< списке выборки >
. В< списке выборки >
можно использовать< параметрическое выражение >
, содержащее, по крайней мере, один< литерал >
. -
Разрешена конструкция
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;