Сообщение для тригера в PL/SQL

asteroidg
Дата: 06.11.2008 11:10:43
Я имел введу что мне нужна какаят-о функция (в моем случае М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;
/


???
tru55
Дата: 06.11.2008 11:15:29
не блокировала эту запись как делает RAISE_APPLICATION_ERROR.

Что означает сия фраза?
ZVV
Дата: 06.11.2008 11:20:05
А чё, обработчика ошибок в C++ Builderе нету?
----------------
Zhirenkov Vitaly
asteroidg
Дата: 06.11.2008 11:28:08
ZVV,

Просто у меня нет исходников в С++ для моего приложения, а только access k базе даной поэтому я использаю все возможные алгоритмы PL/SQl для Oracle !
ZVV
Дата: 06.11.2008 11:29:57
Тогда, насколько я понимаю, "Нет".
----------------
Zhirenkov Vitaly
Тифа
Дата: 06.11.2008 11:58:00
т.е. вы хотите из тригера плскл кодом вызвать месагу в вашем приложении на си?)
asteroidg
Дата: 06.11.2008 13:02:15
Тифа,
Да имено так, либо используя Raise_application_error после вывода ошибки нажимаем OK проверяем код ошибки :

EXCEPTION
when eror1 then null

но в данном случае он пропускает сообщение ... ?

Может я чтото я пропускаю либо это не возможно ???
vnosenco
Дата: 06.11.2008 14:06:25
Для таких целей в UA используй не msg, a warn (не помню точно - отдельная ли это функция или из пакета). Warn использует контекст. Если ты сохраняешь запись первый раз, то получаешь сообщение, если второй то проходит фиксация изменений. Вообщем, поищи в ALL_SOURCE по ключевому слову "WARN" или напиши свою реализацию.

PS
Если ты разработчик в Unisime, то не пиши так:
if :new.ctsc not in(17688) then
Во первых, это в корне не правильно, а, во вторых, Павел давно грозился убивать за явное упоминание айдишников.
asteroidg
Дата: 06.11.2008 16:38:15
vnosenco,
спасибо, получилось то что надо !