Показывать RAISE_APPLICATION_ERROR, когда значение, которое я вставляю, не соответствует предыдущему значению

Я пытаюсь использовать триггер для отображения 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 24.10.2018 10:03

@ user7294900, например, в моей базе данных мой последний p # равен 2, я хочу, чтобы когда пользователь вводил новый p #, он должен быть 3, если это не 3, то должно появиться сообщение об ошибке типа i

diu 1997 24.10.2018 10:07

@ diu1997 выполняет процедуру в командной строке? возможно нужно добавить set serveroutput on size 2000

Moudiz 24.10.2018 10:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
35
1

Ответы 1

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, то ошибка сообщение, которое я набираю, должно выйти

diu 1997 24.10.2018 10:32

Другие вопросы по теме

Функция, созданная с ошибками компиляции в Oracle с таблицей / представлением, не существует
Как создать XML с помощью DBMS_XMLGEN, а затем получить и распечатать с помощью одного SYS_REFCURSOR?
Как сделать приращение, если с помощью триггеров встречается одно и то же имя?
Как получить группировку промежуточных итогов только по одному столбцу
Как получить общее количество строк, затронутых операторами DML в сеансе СУБД блока PLSQL (без использования SQL% ROWCOUNT)?
Отображение данных на основе информации о сеансе пользователя
PL / SQL: ORA-00942: таблица или представление не существует. Внутренняя функция
Триггер Oracle: вставка в объект транзакции новой строки при обновлении, вставка объекта учетной записи
Как получить общее количество обновленных строк, если у нас есть несколько таблиц внутри цикла for в PLSQL?
Получить ошибку: ORA-38824 во время команды «создать или заменить»