Форум программистов, компьютерный форум, киберфорум
Firebird/InterBase
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 98
1

Процедура с условием: если такая запись есть, то update, если нет, то insert

02.11.2014, 19:58. Показов 4608. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хочу сделать процедуру по вбиванию/удалению. Если такая запись есть, то update, если нет, то insert. Подсказали примерно такую штуку, но сделать её под себя я не в состоянии, и синтаксис процедур не особо знаю.
SQL
1
2
3
4
5
6
7
8
9
SET TERM!
CREATE PROCEDURE ins_tov AS DECLARE VARIABLE ID INTEGER
BEGIN
FOR SELECT id_knigi FROM postavka INTO :ID DO
IF (EXISTS(SELECT id_knigi FROM tovar WHERE id_knigi=:ID)) THEN
UPDATE tovar T SET kolichestvo=kolichestvo+1 WHERE id_knigi=:ID;
ELSE
INSERT INTO tovar(nazvanie_knigi,cena_knigi,kolichestvo) VALUES(:ID);
END!
Я так понимаю, она выуживает запросом эту самую запись, и если ничего не вернула, то insert. Но она ругается. Сейчас - на begin. Что в синтаксисе не так?
И ещё вопрос, что означает буква перед set?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2014, 19:58
Ответы с готовыми решениями:

триггеры на проверку если запись есть то пропустить если нет то добавить...
есть триггер но он работает только при добавлении одной записи.... мне нужно что бы он просматривал...

Обновить если запись есть; Создать если записи нет
Ребят подскажите как оптимизировать программу, ибо занимает очень много времени на...

Запретить запись в базу, если в базе уже есть такая запись - PHP БД
Люди добрые помогите кто чем сможет. Есть запрос $number = $_POST; $datetime = $_POST; $dept...

Не срабатывает. Почему? Все просто если запись в таблице есть, то выводим, если нет - выводим заявок нету.
ребят тока не смейтесь я чет туплю под вечер но я условия не могу сделать <?php $statys =...

10
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
02.11.2014, 23:32 2
Какой сервер?
В новых есть команда UPDATE OR INSERT
0
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 98
02.11.2014, 23:37  [ТС] 3
У меня вроде не работает, решил, что следующий простой путь - процедура.
InterBase 6.5 что ли
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
02.11.2014, 23:44 4
Цитата Сообщение от Aleks_006 Посмотреть сообщение
InterBase 6.5
UPDATE OR INSERT в нем нет.
0
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 98
03.11.2014, 00:09  [ТС] 5
Цитата Сообщение от Витальич Посмотреть сообщение
UPDATE OR INSERT в нем нет.
Я, собственно, и не спорю. Нету.
0
912 / 877 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
04.11.2014, 13:26 6
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE PROCEDURE ins_tov 
AS 
DECLARE VARIABLE ID INT;
BEGIN
  FOR 
    SELECT id_knigi 
      FROM postavka 
      INTO :ID 
  DO BEGIN
    UPDATE tovar 
       SET kolichestvo=kolichestvo+1 
     WHERE id_knigi=:ID;
     
    IF (ROW_COUNT=0) THEN
      INSERT INTO tovar
        (id_knigi, nazvanie_knigi, cena_knigi, kolichestvo) 
      VALUES
        (:ID, '?', ?, 1);
  END
END
p.s. знаки вопроса как-бы намекают ...
0
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 98
06.11.2014, 14:40  [ТС] 7
Спасибо, только, по-моему, оно у меня ROW_COUNT не знает. Column unknown
0
912 / 877 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
06.11.2014, 15:44 8
Aleks_006, каюсь, эта переменная доступна лишь в Firebird >= 1.5. Придется так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE PROCEDURE ins_tov 
AS 
DECLARE VARIABLE ID INT;
BEGIN
  FOR 
    SELECT id_knigi 
      FROM postavka 
      INTO :ID 
  DO BEGIN
    IF (EXISTS(SELECT 1 FROM tovar WHERE id_knigi=:ID)) THEN
      UPDATE tovar 
         SET kolichestvo=kolichestvo+1 
       WHERE id_knigi=:ID;
    ELSE 
      INSERT INTO tovar
        (id_knigi, nazvanie_knigi, cena_knigi, kolichestvo) 
      VALUES
        (:ID, '?', ?, 1);
  END
END
1
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 98
07.11.2014, 23:38  [ТС] 9
Я уже сам в своих задачах запутался. Не пойму, зачем я указал в запросе postavka. Из неё нельзя ничего извлекать, т.к. она подчинённая, а tovar главная. И она не м.б. заполнена раньше. Можно тогда написать from tovar?
И не пойму, как можно insert'ить тот же самый :ID, ведь при вбивании новой книги номер должен быть совсем новым? Разве не нужно его передавать параметром, как остальные три значения?
0
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 98
16.11.2014, 16:10  [ТС] 10
Совместными усилиями с преподом наконец-то запилили.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SET TERM!
CREATE PROCEDURE proc1(pidknigi INT,pnazvanieknigi CHAR(100),pcenaknigi INT,pkolichestvo INT)
AS DECLARE VARIABLE ID INT;
BEGIN
SELECT COUNT(id_knigi) FROM tovar WHERE id_knigi=:pidknigi INTO :ID;
IF (ID>0) THEN BEGIN
UPDATE tovar SET kolichestvo=kolichestvo+1 WHERE id_knigi=:pidknigi;
END
ELSE
BEGIN
INSERT INTO tovar(id_knigi,nazvanie_knigi,cena_knigi,kolichestvo)
VALUES(:pidknigi,:pnazvanieknigi,:pcenaknigi,:pkolichestvo);
END
END!
0
0 / 2 / 0
Регистрация: 18.11.2014
Сообщений: 40
18.11.2014, 17:49 11
по моему в эту строку лучше добавить предикат EXISTS
Цитата Сообщение от Aleks_006 Посмотреть сообщение
SQL
1
SELECT COUNT(id_knigi) FROM tovar WHERE id_knigi=:pidknigi INTO :ID;

Основное достоинство предиката существования — высокая скорость выпол-
нения подзапроса. Если вы хотите распознать запрос, основанный на существова-
нии каких-то данных, то не стоит писать следующее:
IF (SELECT COUNT(*) FROM BOOKS WHERE условие)>0 …
При исполнении этого кода (прежде чем оценить условие IF) СУБД будет вы-
нуждена прочитать все строки в исследуемом наборе данных. Чем больше записей
в таблице BOOKS, тем дольше станет выполняться запрос. Напротив запрос, постро-
енный на основе инструкции EXISTS, моментально вернет значение TRUE, как толь-
ко СУБД столкнется с первой же строкой, удовлетворяющей контролируемому ус-
ловию:
IF EXISTS (SELECT * FROM BOOKS WHERE условие) …
0
18.11.2014, 17:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2014, 17:49
Помогаю со студенческими работами здесь

Как проверить запись на существование и добавить ее в базу данных если ее там нет или отредактировать если она там есть?
INSERT INTO AdvancedAccess...

Работа со строками. Дано слово. Удалить из него букву О, если такая есть. Удалить из него последнюю букву Л, если такая есть
Привет! Нужна помощь по задачке по паскалю. Пожалуйста помогите! Задание: Дано слово. Удалить...

Тригер, проверяющ. есть ли такой ID и если есть обновляющий его, если нет - добавляющий
Сабж. В MSSQL нуб. Есть ситуация. Добавляю товар из каталога поставщика в каталог магазина....

Создание системной переменной если её нет и удаление если есть (setenv)
Нужен своеобразный переключатель определенной системной переменной с помощью утилиты setenv. Суть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru