запрос в хранимой процедуре

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Мурад
Сообщения: 4
Зарегистрирован: 03 ноя 2004, 18:46

запрос в хранимой процедуре

Сообщение Мурад » 29 июн 2005, 11:46

есть в данный момент хранимая процедура тело которой следубщее:

Код: Выделить всё

begin
for
  select sum (price) from ord where pat=:nank and vid=:v and dat<=:d and dat>='14.3.2005'
  into result
do
begin
  suspend;
end
end
в текущем виде процедура работает без проблем...

но дело том что мне нужно что то наподобие следующего:

Код: Выделить всё

begin
for
  if "текущая дата">='1.7.2005' then sd :='1.7.2005' else sd :='14.3.2005' ;
  select sum (price) from ord where pat=:nank and vid=:v and dat<=:d and dat>=sd
  into result
do
begin
  suspend;
end
end

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 29 июн 2005, 12:35

Не знаю какой у тебя сервак. Для FB 1.5:

Код: Выделить всё

 
FOR 
SELECT SUM (PRICE) 
  FROM ORD 
 WHERE PAT=:NANK AND VID=:V AND DAT<=:D 
   AND DAT>=CASE WHEN (CURRENT_DATE>='1.7.2005') THEN '1.7.2005' ELSE '14.3.2005' END
  INTO RESULT 
DO BEGIN 
  SUSPEND; 
END 
А вообще не проще ли эту дату на клиенте определять?

Мурад
Сообщения: 4
Зарегистрирован: 03 ноя 2004, 18:46

Сообщение Мурад » 29 июн 2005, 12:49

не хотел менять клиента... показалось что так будет проще...
сервер Ib 7.1

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 29 июн 2005, 13:13

так нельзя
begin
for
if "текущая дата">='1.7.2005' then sd :='1.7.2005' else sd :='14.3.2005' ;
select sum (price) from ord where pat=:nank and vid=:v and dat<=:d and dat>=sd
into result
do
begin
suspend;
end
end
надо так
begin
if "текущая дата">='1.7.2005' then sd :='1.7.2005' else sd :='14.3.2005' ;
for
select sum (price) from ord where pat=:nank and vid=:v and dat<=:d and dat>=sd
into result
do
begin
suspend;
end
end

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 29 июн 2005, 13:14

ну и присвоение не ":=" а просто "=" :wink:

Мурад
Сообщения: 4
Зарегистрирован: 03 ноя 2004, 18:46

Сообщение Мурад » 29 июн 2005, 13:36

Ivan_Pisarevsky писал(а):так нельзя
надо так
begin
if "текущая дата">='1.7.2005' then sd :='1.7.2005' else sd :='14.3.2005' ;
for
select sum (price) from ord where pat=:nank and vid=:v and dat<=:d and dat>=sd
into result
do
begin
suspend;
end
end
как получить текущую дату в Ib 7.1? CURRENT_DATE не проходит...
как надо описать sd? declare variable sd date или declare variable sd varchar(20)?
поле dat в таблице это поле типа date

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 29 июн 2005, 14:05

Я не работаю с иб7, у меня фб152
select current_timestamp... у меня работает

Klyk
Сообщения: 100
Зарегистрирован: 26 окт 2004, 23:28

Сообщение Klyk » 29 июн 2005, 23:42

CURRENT_DATE не проходит
Вот тебе на IB 7.1

Код: Выделить всё

CREATE PROCEDURE MYPROC (
    PARAM2 INTEGER,
    PARAM1 INTEGER)
RETURNS (
    RESULT INTEGER)
AS
DECLARE VARIABLE SD TIMESTAMP;
begin
 if (current_date >= '01.07.2005') then sd = '01.07.2005'; else sd = '14.03.2005';
 for select sum(t.days) from MyTable t
    where t.Field1 = :Param1
          and
          t.Field2 = :param2
    into  :result
 do
 begin
  suspend;
 end
end

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Сообщение SAMZ » 30 июн 2005, 09:41

Klyk писал(а):
CURRENT_DATE не проходит
Вот тебе на IB 7.1

Код: Выделить всё

CREATE PROCEDURE MYPROC (
    PARAM2 INTEGER,
    PARAM1 INTEGER)
RETURNS (
    RESULT INTEGER)
AS
DECLARE VARIABLE SD TIMESTAMP;
begin
 if (current_date >= '01.07.2005') then sd = '01.07.2005'; else sd = '14.03.2005';
 for select sum(t.days) from MyTable t
    where t.Field1 = :Param1
          and
          t.Field2 = :param2
    into  :result
 do
 begin
  suspend;
 end
end
А почему нельзя использовать в качестве текущей даты 'Now'. У меня это прекрасно работает в 1.5.2 , правда в первом диалекте

sokol
Сообщения: 1
Зарегистрирован: 05 окт 2005, 12:32

Сообщение sokol » 05 окт 2005, 17:20

А почему нельзя использовать в качестве текущей даты 'Now'. У меня это прекрасно работает в 1.5.2 , правда в первом диалекте
через 'now' и на третьем работает, но это самое 'now' нужно сначала в промежуточную переменную всунуть... Например так:
----------------------------------------------

Код: Выделить всё

CREATE PROCEDURE MYPROC (
    PARAM2 INTEGER,
    PARAM1 INTEGER)
RETURNS (
    RESULT INTEGER)
AS
DECLARE VARIABLE SD TIMESTAMP;
DECLARE VARIABLE CD TIMESTAMP;
begin
cd = 'now';
 if (cd >= '01.07.2005') then sd = '01.07.2005'; else sd = '14.03.2005';
 for select sum(t.days) from MyTable t
    where t.Field1 = :Param1
          and
          t.Field2 = :param2
    into  :result
 do
 begin
  suspend;
 end
end
------------------------
напрямую 'now' не так интерпретируется...

Ответить