Страница 1 из 1

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

Добавлено: 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

Добавлено: 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 
А вообще не проще ли эту дату на клиенте определять?

Добавлено: 29 июн 2005, 12:49
Мурад
не хотел менять клиента... показалось что так будет проще...
сервер Ib 7.1

Добавлено: 29 июн 2005, 13:13
Ivan_Pisarevsky
так нельзя
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

Добавлено: 29 июн 2005, 13:14
Ivan_Pisarevsky
ну и присвоение не ":=" а просто "=" :wink:

Добавлено: 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

Добавлено: 29 июн 2005, 14:05
Ivan_Pisarevsky
Я не работаю с иб7, у меня фб152
select current_timestamp... у меня работает

Добавлено: 29 июн 2005, 23:42
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

Добавлено: 30 июн 2005, 09:41
SAMZ
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 , правда в первом диалекте

Добавлено: 05 окт 2005, 17:20
sokol
А почему нельзя использовать в качестве текущей даты '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' не так интерпретируется...