Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2011, 00:53   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию Postgre: функция добавления товара на склад

Господа, Вы не могли бы меня проконсультировать. Есть таблица 'tSkad', куда добавляется новые поставки товара. Если до этого код товара не был представлен в этой таблице, происходит Insert, если товар уже представлен в таблице происходит обновление соотвествующего поля. За уникальность кода овечатет соотвествующий индекс (уже прописан).

Проблема в том, что пока не удается запустить обычный Insert - выдает ошибку, ему не нравится завершающий END в коде. Я уже посмотрела все - не понимаю, где цепляется. По легенде прользователь может не помнить название товара и он может ввести только ключевую фразу и функция сама ему выберет все, что надо.

Код:
------Function Tovar na sklad
CREATE OR REPLACE FUNCTION tovar_sklad (text, int)
  RETURNS BOOLEAN AS
     $BODY$
        DECLARE 
           tovar "tTovar"%ROWTYPE;

       BEGIN
          FOR tovar IN SELECT * FROM "tTovar"
             WHERE "tTovar".nazvanie_tovara ~~'%'||$1||'%' 
                  LOOP
                      INSERT INTO "tSklad" (id_sklad, tovat, kolichestvo)
                      VALUES (default, tovar.id_tovar, $2)
                 END LOOP;
   RETURN TRUE;

    END;$BODY$

  LANGUAGE 'plpgsql';

  -----SELECT tovar_sklad ('Red Star', 10)

И как правильно прописать обновление: если Insert удался он возвращает логическое True. Если он вернул False мы можем написать
Код:
IF FALSE  THEN UPDATE 'tSkad' SET  ит.д.
Так, да?
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 28.12.2011, 21:38   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Может пойдет такое общее направление? К Postgre адаптируйте сами
Код:
IF EXISTS(SELECT * FROM tSkad WHERE ... ) THEN
  UPDATE tSkad SET kolichestvo=kolichestvo+$2 WHERE ...
  //здесь не ясно, что будет, если найдется несколько записей по WHERE
  //а ваша задумка это не исключает
  RETURN FALSE;
  //Почему именно False если найдено?
  //может сделать FALSE если найдено несколько и ни куда не писать в этом случае?
  //а если найдена одна запись, то править ее и возвращать TRUE?
ELSE 
  INSERT ... ;
  RETURN TRUE;
END IF;
Лучше мне кажется сначала в переменную поместить к-во найденных записей, а потом проверять больше 1, равно 1 и равно 0
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.12.2011 в 22:00.
Аватар вне форума Ответить с цитированием
Старый 07.01.2012, 14:32   #3
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Дорогой Аватар, спасибо Вам большое за помощь)) Извитие, что поздно отвечаю - я уже и не надеялась на ответ. Будем крутить Вашу идею для Постгри. Вот завтра один экзамен сдам и буду тестить Ваше предложение)))
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
POSTGRE, проц. язык Pl/pg: вывести список оценок Blondy SQL, базы данных 2 20.11.2011 02:20
Postgre: в поле Date возможен ли ввод только года? Blondy SQL, базы данных 2 06.10.2011 20:41
Postgre: проверка правильности ввода email Blondy SQL, базы данных 0 24.09.2011 01:02
Функция генерации цены товара brulik67 PHP 6 15.06.2011 17:28
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04