Как использовать триггер для уменьшения количества и вычисления в APEX, чтобы гарантировать, что количество не опускается ниже 0

#sql #oracle #oracle-apex

#sql #Oracle #oracle-вершина #oracle-apex

Вопрос:

Я хочу создать триггерную функцию, которая уменьшает количество токенов учащегося каждый раз, когда учитель подает жалобу на ученика. В настоящее время у меня нет таблицы, которая отслеживает, когда изменяется количество учащихся, у меня есть только таблица, которая показывает их начальное количество. Могу ли я создать отображение на apex, которое показывает это начальное количество и уменьшает это количество всякий раз, когда учитель отправляет форму на apex, которая является жалобой на этого ученика? (Учителя также должны иметь возможность добавлять токены к учетной записи учащихся за хорошее поведение).

Также это количество токенов не может быть ниже 0, поэтому я предполагаю, что это будет просто вычисление количества токенов, которое гарантирует, что значение токена не может быть меньше 0 (или, по крайней мере, я предполагаю, что это можно сделать).

Я вроде как новичок в триггерах, и все, что я пока знаю о них, — это как создать последовательность и триггер, который вставляет новое значение первичного ключа, когда в базе данных должна быть создана новая строка. Я не привык к триггерам, которые уменьшают количество, поэтому я не уверен, как это будет работать.

Как уже упоминалось, у меня также нет таблицы, которая отслеживает изменение количества токенов студентов, и я не уверен, нужна ли мне таблица в моей базе данных для этого или apex может каким-то образом просто отобразить значение для меня.

Любая помощь приветствуется.

Комментарии:

1. Вы действительно используете MySQL? Или это Oracle?

2. Привет, я думал, mysql — это другое название oracle sql. Теперь я изменил теги.

Ответ №1:

Для меня это выглядит как увеличение и уменьшение голосов в Stack Overflow.

Поскольку есть таблица, которая содержит данные учащихся, и один из столбцов NUMBER_OF_VOTES , тогда у учителей будут две кнопки: P1_UPVOTE и P1_DOWNVOTE (или назовите их как хотите).

Нажатие P1_UPVOTE сделало бы

 update student s set
  s.number_of_votes := s.number_of_votes   1
where s.student_id = :P1_STUDENT_ID;
  

Аналогично, нажатие P2_DOWNVOTE приведет

 update student s set
  s.number_of_votes := s.number_of_votes - 1
where s.student_id = :P1_STUDENT_ID
  and s.number_of_votes > 0;      --> so that student wouldn't have negative votes
  

Я думаю, это должно сработать.

Комментарии:

1. Спасибо, поэтому я предполагаю, что здесь нет необходимости в функции запуска. Также, где я должен вводить этот запрос в Apex? Будет ли это динамическим действием в отношении учителей, подающих жалобу? И как мне отобразить этот счетчик? Могу ли я указать текущее неизменяющееся количество голосов и изменит ли приведенный выше скрипт автоматически отображаемое значение?

2. Обновления будут представлять собой процессы (выполняемые при нажатии соответствующих кнопок, то есть при отправке страницы). Динамическое действие — еще один вариант. Как только страница отправлена, она обновляется и отображает текущее значение счетчика.

3. Привет, я пытался создать процесс для этого, но у меня возникли проблемы. Кажется, я не могу найти способ убедиться, что это работает при отправке моей формы жалобы, поскольку я не вижу возможности для запуска процесса при отправке другого форума на другом

4. В дополнение, я добился некоторого прогресса в уменьшении счетчика на 1 теперь всякий раз, когда учитель подает жалобу. Однако условие >0 не работает. Когда учитель подает жалобу на ученика с 0 токенами, жалоба все равно проходит, и количество токенов учащихся остается равным 0, когда вместо этого на экране учителей должно появиться сообщение об ошибке, в котором говорится, что они больше не могут подать жалобу