Я пытаюсь использовать триггер для отображения RAISE_APPLICATION_ERROR, когда новое значение, которое я вставляю, не соответствует предыдущему. например, моя последняя позиция находится на второй позиции, и когда я хочу вставить новую позицию, которая равна 10, она должна показать ORA-… «сообщение об ошибке, которое я набираю» ?? кто-нибудь может помочь мне отредактировать мой код ?? мне нужен оператор выбора для этого?
SET ECHO ON
SET FEEDBACK ON
SET serveroutput on size 2000
CREATE OR REPLACE TRIGGER RowTrigger
Before
INSERT OR UPDATE on POSITION
FOR EACH ROW
declare
u number(2);
begin
select count(P#) into u from POSITION ;
if :new.P# < u
then
RAISE_APPLICATION_ERROR(-20011,'dddd');
end if;
end;
@ user7294900, например, в моей базе данных мой последний p # равен 2, я хочу, чтобы когда пользователь вводил новый p #, он должен быть 3, если это не 3, то должно появиться сообщение об ошибке типа i
@ diu1997 выполняет процедуру в командной строке? возможно нужно добавить set serveroutput on size 2000
Ok. Иногда мне приходилось писать это, принимая во внимание следующее:
-The P# is unique, or youll get error in the select.
-I am not taking on consideration the previous data , for example if your P# is 5 and ur inserting 3, then youll not have error.
if you need such thing you can continue developing it because there are some conditions to be met.
-The table already contains data , all you can add a exception NO_data_found and do whatever you want in that case.
это код:
drop table ex_employee
/
create table ex_employee (id number(2) null,id1 number(2) NULL,name varchar2(1000) null)
/
drop table POSITION
/
create table POSITION(p# number(2) null)
/
insert into POSITION(p#) values (4)
/
insert into POSITION(p#) values (5)
/
commit
/
CREATE OR REPLACE TRIGGER RowTrigger
FOR INSERT on POSITION compound trigger
prevID number(4);
new_p number(4);
after each row is
begin
new_p := :new.p#;
end after each row;
after statement is
begin
--it gives the previous record;
select PREV_ID into prevID from(SELECt p#, LAG(p#, 1, 0) OVER(ORDER BY p#) as PREV_ID FROM position) where p# = new_p;
-- check if the old data is smaller then the new, you can add more conditions.
if (previd < new_p) then
previd:=previd+1;
end if;
IF (prevID != new_p) THEN
RAISE_APPLICATION_ERROR(-20011, 'ERROR , data not in order or whatever.');
END IF;
end after statement;
end;
/
Я отредактировал свой код, но теперь я хочу, как вы можете видеть, что мой последний db p # находится на 2, я хочу, чтобы когда пользователь вводил новый p #, он должен быть 3, если это не 3, то ошибка сообщение, которое я набираю, должно выйти
Это может сработать, ваш вопрос не ясен, как вы выполняете и в чем именно заключается ошибка