Почему функция to_Char (date, 'd') просто игнорирует условную логику в процедуре Oracle? - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь проверить день даты выполнения и применить скидку, только если это будний день.

// 14/04/2018 Сб

v_performanceday VARCHAR(5);

SELECT PERFORMANCEDATE INTO v_performanceday FROM PERFORMANCE WHERE PERFORMANCEID = p_PerformanceID;
CASE
WHEN (to_char(v_performanceday, 'd') != '6' OR to_char(v_performanceday, 'd') != '7')
    THEN
    INSERT INTO DISCOUNT  (Reason, MembershipID, PerformanceID) 
    VALUES (p_Reason, p_MembershipID, p_PerformanceID)
    returning DiscountID into v_discountid;
    v_discountprice := 2.0;
ELSE
    RAISE_APPLICATION_ERROR(-20101, '***********Members only get discount on weekday performances!***************'); 
END CASE;

Прямо сейчас я получаю эту ошибку.

Error report -
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "USER2.CREATE_NEW_BOOKING", line 56
ORA-06512: at line 1
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
       occurred. For example, this error occurs if an attempt is made to
       assign the value NULL to a variable declared NOT NULL, or if an
       attempt is made to assign an integer larger than 99 to a variable
       declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
       that values do not violate constraints.

Но если я заменю тип данных первой строкиDATE, он применяет скидку независимо от того, вставляю ли я PerformanceID of Performance в будний день или в выходные!

v_performanceday DATE;

Может кто-нибудь помочь мне понять, почему он не применяет функцию to_char должным образом, и просто игнорировать ее, когда другиеутверждения case вокруг этого прекрасно работают, как и ожидалось?

1 Ответ

0 голосов
/ 03 декабря 2018

v_performancedate должна быть датой - это правильный тип.

Ваша логика неверна.or должно быть and.,,или еще лучше, not in:

CASE WHEN to_char(v_performanceday, 'd') not in ('6', '7')
...