即使条件为假,if 中的更新语句也会被执行

Update statements within if are getting executed even when condition is false

pl/sql 块中的更新语句出现问题。 如果 table 不存在,则不应执行更新语句。

更新语句将 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;

错误:如果 table 不存在,我会收到 table 未找到错误(更新语句不应在此执行例)。

如果 table pricechange_full 不存在,该代码将无法运行;它不会编译。如果您想拥有这样的代码,则必须使用 dynamic SQL.

除此之外:

  • count 函数 returns 一个数字;为什么要将它与字符串进行比较? v_table_exists = '1' - 应该是 = 1

  • 这里的整个想法是——正如你所说的——

    append 01 to startdate

    这意味着您将日期存储为字符串。 (又是弦乐?你那么喜欢它们吗?)这真是一个糟糕、糟糕、糟糕、糟糕 的想法。将日期存储到 DATE 数据类型列中。一旦你这样做了,你就不需要这样的代码(你在问题中写和张贴了)并且一切都会自动运行