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

Создание/использование хранимых процедур

16.11.2018, 13:31. Показов 3605. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня!
Вообщем идея такая - есть 2 таблицы:

SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE LOGS (
    ID      IDTYPE,
    GRP     INTEGER,
    EVNT    INDEXTYPE,
    USR     INDEXTYPE,
    EXTINT  EXTINTTYPE,
    OUTINT  EXTINTTYPE,
    DTIME   TIMESTAMP
);
и

SQL
1
2
3
4
CREATE TABLE EXTSTRING (
    ID   IDTYPE,
    STR  VARCHAR(150)
);
Поле EXTINT таблицы LOGS связано с полем ID таблицы EXTSTRING, причем не всегда, чаще всего там пустое значение,
также несколько записей из таблицы LOGS могут ссылаться на одну запись из таблицы EXTSTRING.

В случае добавления новой записи в таблицу LOGS, с учетом того, что будет связь с таблицей EXTSTRING возникает
необходимость совершить следующее:
1. Проверить, имеется ли такая же строка как и входящая в таблице EXTSTRING, если нет, создать ее
2. Вернуть значение ID из таблицы EXTSTRING на нужную строку
3. Добавить новую запись в таблицу LOGS, в котором поле EXTINT равно ID из пункта 2.

В соответствии с этим рисую stored proc:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE PROCEDURE CHECK_ID_EXTSTR
    (EXTSTR VARCHAR(150))
RETURNS
    (ID INT)
AS  DECLARE VARIABLE TID INTEGER;
BEGIN
 SELECT TID2
 FROM extstring
 WHERE (STR = EXTSTR)
 INTO TID2;
 
 IF (TID IS NULL) THEN BEGIN
   TID = gen_id(GEN_LOGS_ID, 1);
   INSERT INTO extstring(TID, STR)
   VALUES(TID, EXTSTR);
   ID = TID;
 END
 INTO ID;
END
Ну и вопросы:
1. Что-то не то с процедурой. Строка 10 "INTO TID2;" - не нужна, но если ее убрать - ругается на IF (TID IS NULL)..., если оставить - ругается на строку 18 "INTO ID;"
2. Получу ли я реально значение генератора, и занесение его в таблицу, как в строках 13, 14? Просто именно это значение
мне и нужно вернуть.
3. Будет ли работать процедура в таком запросе:

SQL
1
2
INSERT INTO logs(id, grp, EVNT, usr, DTIME ,extint, OUTINT)
VALUES(gen_id(GEN_LOGS_ID, 1), 100, 100, 30, '13.11.2018 16:44:58', CHECK_ID_EXTSTR('новая_строка'), 0)
Ну вот как-то так...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2018, 13:31
Ответы с готовыми решениями:

IBExpert+FireBird2.1 создание хранимых процедур
Здравствуйте, подскажите как правильно написать процедуры для добавления,удаления, изменения и...

Создание таблиц и хранимых процедур IB console
Здравствуйте, уважаемы форумчане помогите пожалуйста создать таблицу и хранимую процедуру в IB...

Left join результатов двух хранимых процедур
Доброго дня! Использую Firebird 2.5; запросы и процедуры пишу из интерфейса IBExpert Очень прошу...

Создание представлений и процедур
Представления: 1) Создать список всех вакансий свободных состоянию на 13 июня года. 2) Выбрать...

2
479 / 392 / 112
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
20.11.2018, 03:46 2
Лучший ответ Сообщение было отмечено BorodaOleg как решение

Решение

писал тут не проверяя
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE PROCEDURE CHECK_ID_EXTSTR
(
    GRP     INTEGER,
    EVNT    INDEXTYPE,
    USR     INDEXTYPE,
    EXTINT  EXTINTTYPE,
    OUTINT  EXTINTTYPE,
    DTIME   TIMESTAMP,
    EXTSTR VARCHAR(150)
)
AS  DECLARE VARIABLE ID_EXTSTR INTEGER;
BEGIN
// значение ключа генерируется в триггере
// индекс на поле EXTSTR
UPDATE OR INSERT INTO EXTSTRING (EXTSTR) VALUES (:EXTSTR) matching(EXTSTR) returning id INTO :ID_EXTSTR;
// значение ключа генерируется в триггере
INSERT INTO logs(GRP, EVNT, USR, EXTINT, OUTINT, DTIME) VALUES (:GRP, :EVNT, :USR, :ID_EXTSTR, :OUTINT, :DTIME);
END
1
1 / 1 / 0
Регистрация: 24.10.2018
Сообщений: 16
20.11.2018, 17:38  [ТС] 3
Долго бился, вроде с проблемой справился, затем уже увидел тут ответ.
У меня получилось так:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE PROCEDURE CHECK_ID_EXTSTR
    (EXTSTR VARCHAR(150))
RETURNS
    (ID INT)
AS  DECLARE VARIABLE TID INTEGER;
BEGIN
 SELECT ID TID
 FROM extstring
 WHERE (STR = :EXTSTR)
 INTO :TID;
 ID = TID;
 IF (TID IS NULL) THEN BEGIN
   TID = gen_id(GEN_EXTSTRING_ID, 1);
   INSERT INTO extstring(ID, STR)
   VALUES(:TID, :EXTSTR);
   ID = TID;
 END
 SUSPEND;
END
и соответственно, запрос:

SQL
1
2
INSERT INTO logs(id, grp, EVNT, usr, DTIME ,extint, OUTINT)
VALUES(gen_id(GEN_LOGS_ID, 1), 100, 100, 30, '13.11.2018 16:44:58', (SELECT ID FROM CHECK_ID_EXTSTR('новая_строка')), 0)
Все заработало.
Я думаю, что вышеуказанная процедура тоже будет работать, просто мне нужно было добавлять записи именно Инсертом.
0
20.11.2018, 17:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2018, 17:38
Помогаю со студенческими работами здесь

Использование хранимых процедур
Суть: Есть две хранимые процедуры, А и Б А - главная, Б - дочерняя А должна вызывать Б...

Создание хранимых процедур
Здравствуйте! Возник следующий вопрос. Возможно ли написание собственных хранимых процедур в какой...

Пример создания парметризированных зпросов и хранимых процедур и использование их в ASP
Интересует сабж.

Создание хранимых процедур и представлений
Добрый вечер, Подскажите как создавать процедуры и представления в MySQL, а точнее где. Скажем в...

Создание хранимых процедур для Ms Sql Server 2008 r2
Дайте ссылки на материал, или вкраце изложите как написать хранимые процедуры. Не могу понять с...

Создание хранимых процедур, возвращающие общие суммы для заданного года
USE Northwind; --Go --Create PROCEDURE Product_sum --@fname datetime, --@sname datetime --...


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

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