即使条件为假,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
数据类型列中。一旦你这样做了,你就不需要这样的代码(你在问题中写和张贴了)并且一切都会自动运行
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
数据类型列中。一旦你这样做了,你就不需要这样的代码(你在问题中写和张贴了)并且一切都会自动运行