Динамический SQL (где) в хранимой процедуре Firebird - PullRequest
1 голос
/ 08 марта 2019

У меня есть SP, который получает 2 параметра, P1 и P2, например:

CREATE OR ALTER PROCEDURE MY_PROC (P1 varchar(10), P2 smallint = 1)
RETURNS (
    code      VARCHAR(10),
    name      VARCHAR(70),
    state     VARCHAR(2),
    situation VARCHAR(20)
AS 
    ...
    ...

И мне нужно сгенерировать предложение where на основе параметра P2, например:

if (P2=1) then
    where (state='SP' and situation='stopped')  
elseif (P2=2)
    where (state='MG' and situation='moving')

Как использовать этот тип оператора if в предложении where?

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Для меня ваш вопрос переводится как простое условие OR в предложении WHERE SQL-запроса:

WHERE
   (:P2 = 1 AND state='SP' and situation='stopped')
   OR (:P2 = 2 AND state='MG' and situation='moving')
1 голос
/ 08 марта 2019

Ответ GMB будет хорошо работать в большинстве ситуаций, но в более сложных случаях он может иметь менее желаемую производительность.Альтернативным решением будет динамическое построение строки запроса и выполнение ее с execute statement:

CREATE OR ALTER PROCEDURE MY_PROC (P1 varchar(10), P2 smallint = 1)
RETURNS (
    code      VARCHAR(10),
    name      VARCHAR(70),
    state     VARCHAR(2),
    situation VARCHAR(20)
AS 
declare query varchar(2048);
begin
  query = 'select ......';
  if (p2 = 1) then
    query = query || ' where (state=''SP'' and situation=''stopped'')';
  else if (p2 = 2) then
    query = query || ' where (state=''MG'' and situation=''moving'')';

  -- if you expect a single result
  execute statement query into code, name, state, situation;

  -- OR

  -- for multiple results
  for execute statement query into code, name, state, situation do
    suspend;
end
...