Проблема с операторами обновления в блоке pl/sql. Если таблица не существует, то она не должна выполнять операторы обновления.
Операторы обновления добавляют 01 к дате начала и последний день месяца до даты окончания.
SET SQLBLANKLINES ON;
DECLARE
v_table_exists varchar2(2);
BEGIN
SELECT count(*) INTO v_table_exists FROM USER_TABLES WHERE TABLE_NAME = 'PRICECHANGE_FULL';
IF (v_table_exists = '1') THEN
UPDATE PRICECHANGE_FULL SET PS_START_MONTH=TO_CHAR(TO_DATE(PS_START_MONTH, 'YYYYMM'), 'YYYYMMDD') WHERE LENGTH(PS_START_MONTH)=6;
UPDATE PRICECHANGE_FULL SET VC_ITEM_START_MONTH=TO_CHAR(TO_DATE(VC_ITEM_START_MONTH, 'YYYYMM'), 'YYYYMMDD') WHERE LENGTH(VC_ITEM_START_MONTH)=6;
UPDATE PRICECHANGE_FULL SET CALC_ITEM_START_MONTH=TO_CHAR(TO_DATE(CALC_ITEM_START_MONTH, 'YYYYMM'), 'YYYYMMDD') WHERE LENGTH(CALC_ITEM_START_MONTH)=6;
UPDATE PRICECHANGE_FULL SET ITEM_START_MONTH=TO_CHAR(TO_DATE(ITEM_START_MONTH, 'YYYYMM'), 'YYYYMMDD') WHERE LENGTH(ITEM_START_MONTH)=6;
UPDATE PRICECHANGE_FULL SET PS_EXPIRY_MONTH=TO_CHAR(LAST_DAY(TO_DATE(PS_EXPIRY_MONTH, 'YYYYMM')), 'YYYYMMDD') WHERE LENGTH(PS_EXPIRY_MONTH)=6;
UPDATE PRICECHANGE_FULL SET ITEM_END_MONTH=TO_CHAR(LAST_DAY(TO_DATE(ITEM_END_MONTH, 'YYYYMM')), 'YYYYMMDD') WHERE LENGTH(ITEM_END_MONTH)=6;
UPDATE PRICECHANGE_FULL SET VC_ITEM_END_MONTH=TO_CHAR(LAST_DAY(TO_DATE(VC_ITEM_END_MONTH, 'YYYYMM')), 'YYYYMMDD') WHERE LENGTH(VC_ITEM_END_MONTH)=6;
UPDATE PRICECHANGE_FULL SET CALC_ITEM_END_MONTH=TO_CHAR(LAST_DAY(TO_DATE(CALC_ITEM_END_MONTH, 'YYYYMM')), 'YYYYMMDD') WHERE LENGTH(CALC_ITEM_END_MONTH)=6;
COMMIT;
END IF;
END;
/
exit;
Ошибка: Если таблица не существует, я получаю сообщение об ошибке таблица не найдена (операторы обновления не должны выполняться в этом случае).
@KoenLosrie добавил рассматриваемую ошибку
Этот код не может работать, если таблица pricechange_full
не существует; это не будет компилироваться. Если вы хотите иметь такой код, вам придется использовать динамический SQL.
Помимо этого:
count
функция возвращает ЧИСЛО; почему вы сравниваете его со строкой? v_table_exists = '1'
- должно быть = 1
вся идея заключается в том, чтобы, как вы сказали,
append 01 to startdate
Это означает, что вы храните даты в виде строк. (Опять струны? Вы их так любите?) Это действительно плохая, Плохая, ПЛОХАЯ, ПЛОХОЙ идея. Храните даты в DATE
столбцах типа данных. Как только вы это сделаете, вам не понадобится такой код (вы написали и разместили в вопросе), и все будет работать само по себе.
Этот код выглядит нормально. Непонятно, с чем вам нужна помощь. Вы получаете ошибку? Это дает вам неожиданный результат?