Сообщение для тригера в PL/SQL
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Сообщение для тригера в PL/SQL - 2008-11-04 17:27:31.320000
|
|
|
AsteroidG
Сообщений: 4
Оценки: 0
Присоединился: 2008-05-20 16:12:37.140000
|
Подскажите пожалуста как можно вывести сообщение когда выполняется тригер. На падобие я вел один продукт у него количество продажы истеклаб мне нужно чтобы тригер показал сообщение что его нету на складе но не блокировал эту запись просто он должен информировать а не бдокировать.
|
|
|
RE: Сообщение для тригера в PL/SQL - 2008-11-05 09:04:48.540000
|
|
|
Pupkin-Zade
Сообщений: 9398
Оценки: 1489
Присоединился: 2004-03-10 13:54:16
|
Ну так пишешь тригер на SELCT и в нем возвращаешь сообщение, в чем проблема то?
|
|
|
RE: Сообщение для тригера в PL/SQL - 2008-11-05 09:26:27.883333
|
|
|
AsteroidG
Сообщений: 4
Оценки: 0
Присоединился: 2008-05-20 16:12:37.140000
|
//Pupkin-Zade Я имел введу что мне нужна какаят-о функция (в моем случае МSG но она использует RAISE_APPLICATION_ERROR(AError, AText) ) которая при реагировании тригера на ввод неправильных данных вывела в моем приложение (приложение написано на C++ Builder) которая использует Oracle 10 g, сообщение о недостоверности водимых данных и рарешала бы дальше работать и не блокировала эту запись как делает RAISE_APPLICATION_ERROR. Тригер имеет вид: CREATE OR REPLACE TRIGGER UN4.TRiG_Ver_Cant instead OF INSERT OR UPDATE ON UN4.VMDB_CMN202D FOR EACH ROW DECLARE CA NUMBER; eroare EXCEPTION; BEGIN ca:=Un$sold.CALC_SOLD(sysdate, 2161, ' ', :new.ctsc, :new.ctdep, ' ', ' ', ' ', ' ', ' ', 158159); IF INSERTING THEN if :new.ctsc not in(17688) then if (:new.cant>ca) then begin raise eroare; end; end if; end if; ELSIF UPDATING THEN if :new.ctsc not in(17688) then if (:new.cant>ca) then begin raise eroare; end; end if; end if; END IF; EXCEPTION WHEN eroare THEN msg('Cantitatea produsului '||:new.ctsc||' depaseste resturile la depozitul '||:new.ctdep||' de: '||ca); end; / ???
|
|
|
RE: Сообщение для тригера в PL/SQL - 2008-11-15 15:25:58.726666
|
|
|
tеstеr
Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
|
Не знаю как у других, но в моем браузере фрагмент кода выгладел нечитабельно, поэтому боее отфроматированный вариант (из которого лищние условия были выброшены):
CREATE OR REPLACE TRIGGER UN4.TRiG_Ver_Cant
instead OF INSERT OR updаtе
ON UN4.VMDB_CMN202D FOR EACH ROW
DECLARE CA NUMBER;
eroare EXCEPTION;
BEGIN
ca:=Un$sold.CALC_SOLD(sysdate, 2161, ' ', :new.ctsc, :new.ctdep, ' ', ' ', ' ', ' ', ' ', 158159);
IF INSERTING or UPDATING THEN
if (:new.ctsc not in(17688)) AND (:new.cant>ca) then
raise eroare;
end if;
END IF;
EXCEPTION
WHEN eroare THEN
msg('Cantitatea produsului '||:new.ctsc||' depaseste resturile la depozitul '||:new.ctdep||' de: '||ca);
end; М.б проблема в null, по любому нужен отладчик запроса, запусти и разберись. Я в оракле никак, но может триггер вызывается перез свтавкой обновлениям, а не после, в результате значения :new.ctsc и :new.ctdep не определены. Или может они не конвертируемы в строковое представление. По идее должно быть так (в теме ты это и указал): 1. в исключении создается и посылается сообщение. 2. в твоем приложении на С++ Билдер срабатывает событие - пришло новое сообщение 3. от туда ты вызвваешь MSGBOX (у него параметрах задаешь что нужно спросиь и как ответят: Ok+Отмена || Да+Нет …) 4. Принимаешь ответ от пользователя 5. Отправляешь ответ базе 6. код заданный в исключении продолжает работу (он принял твое сообщение и обработал его) Подготовить сообщение это - PACK_MESSAGE Послать сообщение - SEND_MESSAGE Получить ответ - RECIVE_MESSAGE Получить тип ответа - NEXT_ITEM_TYPE Получиь значение ответа - UNPACK_MESSAGE Я никогда не огранизовывал общение между БД и Приложением кроме как запросами - выборка/вставка, но думаю эти сообщения именно для таких случаев и нужны.
|
|
|
|
|