SYSDATE
уже дата, поэтому
TO_DATE(SYSDATE, 'MM/DD/YYYY')
на самом деле не имеет смысла. Вы делаете неявное преобразование в строку, а затем явное преобразование в дату, то есть фактически:
TO_DATE(TO_CHAR(SYSDATE, <NLS_DATE_FORMAT>), 'MM/DD/YYYY')
Работает ли это, зависит от настройки NLS_DATE_FORMAT вашей сессии:
alter session set nls_date_format = 'MM/DD/YYYY';
select TO_DATE(SYSDATE, 'MM/DD/YYYY') from dual;
TO_DATE(SY
----------
07/04/2018
select TO_CHAR(TO_DATE(SYSDATE, 'MM/DD/YYYY'), 'YYYY-MM-DD') from dual;
TO_CHAR(TO
----------
2018-07-04
alter session set nls_date_format = 'DD/MM/YYYY';
select TO_DATE(SYSDATE, 'MM/DD/YYYY') from dual;
TO_DATE(SY
----------
07/04/2018
select TO_CHAR(TO_DATE(SYSDATE, 'MM/DD/YYYY'), 'YYYY-MM-DD') from dual;
TO_CHAR(TO
----------
2018-04-07
alter session set nls_date_format = 'DD-MON-YYYY';
select TO_DATE(SYSDATE, 'MM/DD/YYYY') from dual;
ORA-01858: a non-numeric character was found where a numeric was expected
alter session set nls_date_format = 'YYYY-MM-DD';
select TO_DATE(SYSDATE, 'MM/DD/YYYY') from dual;
ORA-01843: not a valid month
Обратите внимание, что первые два «работают», но на самом деле дают разные даты. (Позже в этом месяце, после 12-го, второй тоже не удастся с ошибкой неправильного месяца.)
Сессия, из которой вы запускаете анонимный блок, и сессия, из которой вы выполняете процедуру, просто имеют разные настройки NLS. Вот почему вы не должны полагаться на неявное преобразование или настройки NLS ...
В любом случае удалите ненужные преобразования:
SELECT 'Q' || TO_CHAR(SYSDATE, 'Q')
|| '/' || LPAD(TO_CHAR(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL), '3', '0')
|| '/' || TO_CHAR(EXTRACT(YEAR FROM SYSDATE))
INTO v_general_number
FROM DUAL;
или сделать то же самое с заданием вместо выбора из двойного:
v_general_number := 'Q' || TO_CHAR(SYSDATE, 'Q')
|| '/' || LPAD(TO_CHAR(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL), '3', '0')
|| '/' || TO_CHAR(EXTRACT(YEAR FROM SYSDATE));
или даже просто как альтернатива:
v_general_number := TO_CHAR(SYSDATE, '"Q"Q"/"')
|| TO_CHAR(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL, 'FM000')
|| TO_CHAR(SYSDATE, '"/"YYYY');
, который использует символьные литералы в моделях формата даты для замены конкатенации косых черт, и модель формата для порядкового номера, поэтому вам не нужно дополнять его нулями. (И вам на самом деле не нужна переменная, вы можете сделать ту же конструкцию внутри предложения values
вставки.)