#oracle #triggers #oracle-sqldeveloper
#Oracle #триггеры #oracle-sqldeveloper-разработчик
Вопрос:
У меня есть триггерный оператор, в котором я хочу сравнить два значения даты и вычесть их. Когда я пытаюсь это сделать, я получаю сообщение об ошибке ORA-06502: PL / SQL: ошибка числового или значения: ошибка преобразования символа в число
Вот код триггера вместе со вставкой, которую я пытаюсь выполнить.
CREATE OR REPLACE TRIGGER BALANCE_FEE
AFTER INSERT OR UPDATE OR DELETE ON CHARTERS
FOR EACH ROW
DECLARE
FEE NUMBER;
ACL_DATE DATE;
EXP_DATE DATE;
GRP_ID NUMBER;
BEGIN
ACL_DATE := :NEW.ACL_RETURN_DATE;
EXP_DATE := :NEW.EXP_RETURN_DATE;
GRP_ID := :NEW.GRP_ID;
IF ACL_DATE > EXP_DATE
THEN
FEE := (ACL_DATE - EXP_DATE) * 75;
IF ACL_DATE < EXP_DATE
THEN
FEE := (ACL_DATE - EXP_DATE)* -20;
ELSE
FEE := 0;
END IF;
END IF;
UPDATE CUSTOMER
SET CUSTOMER.BALANCE = CUSTOMER.BALANCE FEE
WHERE CUSTOMER.GRP_ID = GRP_ID;
END;
/
SHOW ERROR;
Вот инструкции insert, которые я пытаюсь выполнить.
INSERT INTO CHARTERS (CHARTER_ID,BOAT_ID,EXP_RETURN_DATE,ACL_RETURN_DATE,GRP_ID) VALUES ('T001','B001',TO_DATE ('2019/01/20', 'yyyy/mm/dd'),TO_DATE ('2019/01/20', 'yyyy/mm/dd'),'G002');
INSERT INTO CHARTERS (CHARTER_ID,BOAT_ID,EXP_RETURN_DATE,ACL_RETURN_DATE,GRP_ID) VALUES ('T002','B002',TO_DATE ('2019/03/10', 'yyyy/mm/dd'),TO_DATE ('2019-03/08', 'yyyy/mm/dd'),'G001');
INSERT INTO CHARTERS (CHARTER_ID,BOAT_ID,EXP_RETURN_DATE,ACL_RETURN_DATE,GRP_ID) VALUES ('T003','B003',TO_DATE ('2019/05/05', 'yyyy/mm/dd'),TO_DATE ('2019/05/07', 'yyyy/mm/dd'),'G003');
Если это поможет, вот таблица чартерных рейсов, если вы считаете, что это может иметь какое-то отношение к этому.
CREATE TABLE CHARTERS (
CHARTER_ID VARCHAR(20),
BOAT_ID VARCHAR(20) REFERENCES BOAT(BOAT_ID),
GRP_ID VARCHAR(20) REFERENCES CUSTOMER(GRP_ID),
EXP_RETURN_DATE DATE,
ACL_RETURN_DATE DATE);
и это код ошибки, который я получаю при попытке запустить все три оператора insert
INSERT INTO CHARTERS (CHARTER_ID,BOAT_ID,EXP_RETURN_DATE,ACL_RETURN_DATE,GRP_ID) VALUES ('T003','B003',TO_DATE ('2019/05/05', 'yyyy/mm/dd'),TO_DATE ('2019/05/07', 'yyyy/mm/dd'),'G003')
Error report -
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "ADMIN_BF.BALANCE_FEE", line 11
ORA-04088: error during execution of trigger 'ADMIN_BF.BALANCE_FEE'
Ответ №1:
В вашей таблице тип данных GRP_ID
равен is VARCHAR(20)
, а в вашем триггере вы присваиваете его Number
переменной.
Вам необходимо обновить свой триггер, чтобы изменить тип данных переменной GRP_ID
Заменить
GRP_ID NUMBER;
с помощью
GRP_ID VARCHAR2(20);