powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Re: Как связать две таблицы по одинаковым полям
25 сообщений из 30, страница 1 из 2
Re: Как связать две таблицы по одинаковым полям
    #39066144
saikle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть процедура TEST_PROC без suspend. Она делает select одной записи (последней записи в таблице). Возвращает поля ID,TEST
Есть триггер
CREATE trigger people_test for people
active before insert position 2
as
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TEST VARCHAR(255);
begin
execute procedure (TEST_PROC)
returning_values
:ID,
:TEST;
end

Как изменить триггер, чтобы после его выполнения выводился результат выполнения процедуры?
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066146
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак. Триггер выполняется на сервере и выводить что-либо куда-либо технически не может.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066149
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikle,

Куда выводился?
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066159
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikle,

Руководство по языку
SQL СУБД Firebird 2.5
6 сентября 2015 — v.0336-1 для Firebird 2.5.4Пример 7.22. Оповещёние приложения о вставке записи в таблицу
SALES
SETTERM ^;
CREATE TRIGGERPOST_NEW_ORDER FORSALES
ACTIVE AFTER INSERT POSITION0
AS
BEGIN
POST_EVENT 'new_order';
END^
SETTERM ;^
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066208
saikle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Последнее сообщение почти то что надо. Но хотелось бы чтобы процедуру, которая делает select,вызвать из триггера. И чтобы она, когда её вызовет триггер, в IBExpert показала последнюю запись (то есть только что вставленную).
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066225
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikle,

В триггере тебе никто не мешает вызвать хранимую процедуру. Ее результаты ты можешь записать в таблицу. А в ИБЭ - сделать select из этой таблицы и посмотреть, что тебе вернула хранимая процедура.

Хотя в принципе ничто не мешает в том же ИБЭ сразу вызвать хранимку, без извратов с триггерами.
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066234
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikleИ чтобы она, когда её вызовет триггер, в IBExpert показала последнюю запись
(то есть только что вставленную).
По-моему, ты совсем не понимаешь что такое триггер, когда и как он вызывается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066235
saikle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как мне её правильно вызвать, чтобы в IBExpert Она мне показала последнюю запись
Я это и спрашиваю

CREATE trigger people_test for people
active before insert position 2
as
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TEST VARCHAR(255);
begin
execute procedure (TEST_PROC)
returning_values
:ID,
:TEST;
end
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066243
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikleА как мне её правильно вызвать, чтобы в IBExpert Она мне показала последнюю запись
Я это и спрашиваю


Кто она-то?

Сам код этой TEST_PROC показать можешь?
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066263
saikle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SET TERM ^ ;

create or alter procedure NEW_NAME
returns (
ID integer,
NAME varchar(255))
as
BEGIN
FOR
Select People.ID,People.NAME from people where People.ID =( Select max(People.ID) from people)
INTO :ID,
:NAME

DO
BEGIN

END
END^

SET TERM ; ^
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066265
saikle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
saikle,

она же TEST_PROC
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066268
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikle,

тебе нужно
а) учиться, учиться и учиться
б) INSERT RETURNING
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066271
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikleПоследнее сообщение почти то что надо. Но хотелось бы чтобы процедуру, которая делает select,вызвать из триггера. И чтобы она, когда её вызовет триггер, в IBExpert показала последнюю запись (то есть только что вставленную).

Код: sql
1.
2.
3.
INSERT INTO people(TEST)
VALUES ('ла-ла-ла')
RETURNING ID, TEST



не оно? И процедуры не надо
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066297
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066334
saikle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
roadstersaikle,

http://www.ibase.ru/devinfo/sp_call.htm
эту статью я видел и если бы она помогла, то я бы не спросил
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066339
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikle,

результат работы процедуры можно записать в поля записи внутри триггера (new.), а результат этих изменений - через insert returning. Но вся эта идея совершенно фиговая, потому что триггер сам по себе ничего не возвращает, никуда.
Кроме того, приводят в уныние
- "процедура делает select последней записи". Что такое "последней"?
- зачем триггеру "последняя запись"?
- какие "последние" записи увидят два одновременно сработавших триггера?
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066344
saikle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvsaikle,

результат работы процедуры можно записать в поля записи внутри триггера (new.), а результат этих изменений - через insert returning. Но вся эта идея совершенно фиговая, потому что триггер сам по себе ничего не возвращает, никуда.
Кроме того, приводят в уныние
- "процедура делает select последней записи". Что такое "последней"?
- зачем триггеру "последняя запись"?
- какие "последние" записи увидят два одновременно сработавших триггера?
Процедура возваращает, а мы её вызываем.
Учу триггеры и хп, просто нужно
последняя запись та, у который максимальный ID
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066357
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikleпоследняя запись та, у который максимальный ID

да ладно.

Код: sql
1.
2.
INSERT MYTABLE(ID, TEXT)
VALUES (-1, 'тру ля-ля');



при этом MAX(ID) может вернуть 10000000
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066359
saikle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пусть будет не последняя запись. Просто та запись, у которой максимальный ID
Я хочу просто вызвать из триггера хп, чтобы он мне вывел такое же сообщение, что и просто написать execute procedure
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066360
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikle,

какое ещё на фиг сообщение? БД вообще-то с помощью SQL запросов общается с приложением, а не сообщений. Есть конечно ещё POST_EVENT, но он сделан совершенно не для того чтобы выводить информацию.

Чем тебе обычный RETURNING не подходит? И не надо никакой процедуры внутри триггера городить.
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066374
saikle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисsaikle,

какое ещё на фиг сообщение? БД вообще-то с помощью SQL запросов общается с приложением, а не сообщений. Есть конечно ещё POST_EVENT, но он сделан совершенно не для того чтобы выводить информацию.

Чем тебе обычный RETURNING не подходит? И не надо никакой процедуры внутри триггера городить.
запрос, я не правильно выразился.
Но можно меня понять. Я написал. Что триггер должен сделать то же самое, что если просто вызвать процедуру через execute procedure. Но только, как это написать в триггере? Нет, мне бы процедурой. Но другие способы тоже интересны
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066378
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikle,

Так что ли?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE trigger people_test for people
active before insert position 2
as
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TEST VARCHAR(255);
begin
   execute procedure TEST_PROC returning_values :ID, :TEST;
end
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066383
saikle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMastersaikle,

Так что ли?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE trigger people_test for people
active before insert position 2
as
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TEST VARCHAR(255);
begin
   execute procedure TEST_PROC returning_values :ID, :TEST;
end


Да. Только почему то триггер создаётся. Но после вставки не делает то же самое, что делает просто execute procedure TEST_PROC
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066392
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikle,

В Firebird все DML триггеры FOR EACH ROW. Поэтому они автоматически содержат текущую запись через NEW/OLD. Если у тебя ID - это автоинкремент устанавливаемый BEFORE триггером с помощью генератора, то в AFTER INSERT триггере ты и так имеешь последнюю добавленную запись. А потом ты можешь в этом засунуть эту запись например в другую табличку. Ну а получить эту запись, например, вызвав SELECT из этой таблички.

Про триггер. Он ничего и никуда возвращать не может. Ибо триггер ты никак не вызовешь напрямую. Триггер - это обработчик DML события. Нету у него ни входных, ни выходных параметров.

INSERT ... RETURNING сразу вернёт тебе только что вставленную запись с учётом всех изменений сделанных BEFORE триггером. AFTER триггер не надо. Процедуру свою можешь вообще выкинуть.
...
Рейтинг: 0 / 0
Re: Как связать две таблицы по одинаковым полям
    #39066395
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saikleПроцедура возваращает, а мы её вызываем.
триггер-то не возвращает. Например, пишем триггер с позицией 1000, меняющий ваши столбцы. И все, тю-тю результатам процедуры.

saikleПросто та запись, у которой максимальный ID
в РСУБД так не делают. В общем случае MAX() не применяют вот в таких ситуациях. В других - сколько угодно.

saikleЧто триггер должен сделать то же самое, что если просто вызвать процедуру через execute procedure.
никак это не написать в триггере. уже двадцать раз сказали, что триггер только может поменять столбцы. Куда-то там вернуть он ничего не в состоянии.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Re: Как связать две таблицы по одинаковым полям
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]