Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование CASE в хранимой процедуре. 
V
    Опции темы
Akella
Дата 21.11.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Приветствую всех!
в хранимой процедуре хочу использовать CASE
но IBExpert ругается на begin 
Код

select case (CURRENT_WEEK_DAY)
  when 2 then begin --вот здесь ошибка
                if (v_pn = 1) then result = 1
              end
  when 3 then begin
                if (v_vt = 1) then result = 1
              end
  when 4 then begin
                if (v_sr = 1) then result = 1
              end 

можно ли использовать такую конструкцию или нет?
имею ввиду 
Код

when .... then begin
                        какой-то код
                      end 


ошибка вот такая: 
Цитата

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 23, column 15.
begin. 


Добавлено через 6 минут и 9 секунд
Вообще что нужно?
Есть в таблице 6 полей типа smallint (остальные не беру во внимание сейчас). Каждое поле - день недели: Пн, Вт, Ср, Чт, Пт, Сб.
Пользователь в таблице ставит галки для каждой записи. Т.е. выбирает, что та запись идёт для Пн и Сб, дрйгая на все дни и т.д.

Как определить текущий номер дня недели я знаю, а вот теперь нужно определить, ТО что запись соответствует сегодняшнему дню недели. КАК?

Допустим, что сегодня понедельник. Берём запись, проверяем, что в поле Pn, если 1, то запись обрабатываем. В принцыпе всё готово, кроме определения записи к текущему дню недели.
PM MAIL   Вверх
Deniz
Дата 22.11.2007, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Формат case
Код

select
  case intfield
    when 1 then 'Result 1'
    when 2 then 'Result 2'
    else 'Result 3'
  end
from test
begin и if в select не используются, соот-но и ругается.
В ХП лучше использовать for select, и внутри уже обрабатывать.
Если нужен именно select, то можно найти UDF что-то типа IIF() или написать свою
Можно еще подумать про хранение всех v_pn, v_vt, v_sr и т.д. в одном поле char(6) например 
'001011' - среда, пятн. и суббота
Построить CURRENT_WEEK_DAY не проблема, для четверга '___1__'
тогда запрос получится чуть легче.
Код
select ... from ... where days like :CURRENT_WEEK_DAY


Добавлено через 1 минуту и 37 секунд
Кстати неплохо бы указать версию сервера
Все что писал я справедливо для FireBird 1.5, для 2 не знаю не работаю.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 22.11.2007, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



 smile  2.0.3
PM MAIL   Вверх
TaNK
Дата 29.11.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Цитата(Akella @ 22.11.2007,  09:10)
smile  2.0.3

В версии 2.0 и выше изменений не придвиделось по case, так что, верить Deniz'y!


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Akella
Дата 20.12.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



я пошёл другим путём - создал 7 процедур, т.е. по процедуре на каждый день и там

Код

where
treklama.CH = 1 --четверг

или
where
treklama.PT = 1 --тяпница
и т.д.


Добавлено @ 12:10
а из приложения уже запускаю нужную

Это сообщение отредактировал(а) Akella - 20.12.2007, 14:47
PM MAIL   Вверх
Deniz
Дата 20.12.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(Akella @  20.12.2007,  15:10 Найти цитируемый пост)
я пошёл другим путём - создал 7 процедур, т.е. по процедуре на каждый день и там
жестоко

А можно еще вот так извратиться:
Код

select t.* from table t
where
  coalesce(d1, '0') ||
  coalesce(d2, '0') ||
  coalesce(d3, '0') ||
  coalesce(d4, '0') ||
  coalesce(d5, '0') ||
  coalesce(d6, '0') ||
  coalesce(d7, '0')
like '__1____'
 это пример для "среды", можно жестоко 

Это сообщение отредактировал(а) Deniz - 20.12.2007, 13:05


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 20.12.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Deniz, ну да, тока у меня нет поля, где хранится "1_1_1__" на понедельник, среду и тяпницу

пока один минус, если что-то в общей логике меняется, то нужно править 7 процедур :(
PM MAIL   Вверх
Deniz
Дата 21.12.2007, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(Akella @  20.12.2007,  17:46 Найти цитируемый пост)
у меня нет поля, где хранится "1_1_1__" на понедельник, среду и тяпницу
исхода из первого вопроса, нужно было определить записи для конкретного дня недели.
Итак:
Код

CREATE PROCEDURE SP_GetWeekDaySTR(CurrDate date)
RETURNS (strdays varchar(7))
AS
declare variable wday integer;
declare variable i integer;
begin
  /* Procedure Text */
  select extract(weekday from :currdate) from rdb$database into :wday;
  i = 1;
  strdays = '';
  while (i <= 7) do begin
    if (i = wday) then
      strdays = strdays || '1';
    else
      strdays = strdays || '_';
    i = i + 1;
  end
  suspend;
end
процедура возвращает шаблон типа '____1__' для переданной даты.
Если нужно выбрать записи для нескольких дней, нужно определить, как передаются эти несколько дней.
Или ты что-то недоговариваешь, или одно из трех ...  smile 


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 21.12.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Deniz, спасибо, конечно, но мне это уже не нужно
всё равно за активную помощь +1 smile

Добавлено через 45 секунд
Цитата(Deniz @  21.12.2007,  06:43 Найти цитируемый пост)
Если нужно выбрать записи для нескольких дней, нужно определить, как передаются эти несколько дней.

мне не нужно несколько дней, ибо редакция отдаёт в печать информацию только за конкретный день.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.