#sql #database #oracle #plsql
#sql #База данных #Oracle #plsql
Вопрос:
Итак, у меня есть это университетское задание, в котором я должен создать триггер с именем bill_overdue. Когда строка со статусом = просрочено вставляется в таблицу invoice , строка вставляется в другую таблицу с именем message .
CREATE SEQUENCE AUTOINCREMENTMESSAGE
MINVALUE 100
START WITH 101
INCREMENT BY 1
CACHE 10
;
CREATE OR REPLACE TRIGGER BILL_OVERDUE
BEFORE INSERT ON INVOICE
FOR EACH ROW
WHEN (NEW.STATUS = 'Overdue')
BEGIN
INSERT INTO MESSAGE (MESSAGENO,MESSAGEDATE,ORIGIN,MESSAGE)
VALUES (AUTOINCREMENTMESSAGE.nextval,SYSDATE,USER,:NEW.DATEISSUED,:NEW.INVOICENO,:NEW.CAMPAIGNTITLE);
END;
/
Теперь, как вы можете видеть, я хочу добавить :new.dateissued
:new.invoiceno
и :new.campaigntitle
в одно поле ( message
). Теперь я знаю, что то, что я сделал, неправильно, но я попытался добавить круглые скобки вокруг него и т. Д., И, Похоже, ничего не делает то, что я хочу. Как мне заставить это работать? Возможно ли делать то, что я хочу, или я понял это совершенно неправильно?
Комментарии:
1. Вы вставляете шесть значений в три столбца. Это не сработает. Вам нужно будет объединить три значения в одно, используя один из методов конкатенации, приведенных ниже (при условии, что имеет смысл их объединить).
Ответ №1:
Вы могли бы использовать конкатенацию
:new.dateissued || ', ' || :new.invoiceno || ', ' || :new.campaigntitle
Ответ №2:
Для Oracle вы также можете выполнить объединение с помощью CONCAT()
функции, и вы можете попробовать
CONCAT(:NEW.DATEISSUED,:NEW.INVOICENO,:NEW.CAMPAIGNTITLE)
Возможно, вам придется преобразовать / преобразовать некоторые из этих значений.