IF IN循环中的IF ELSE语句在oracle中不起作用

时间:2014-05-12 11:40:59

标签: sql oracle if-statement for-loop

大家好我一直在尝试实现将表数据从null更改为非null的简单代码。我到目前为止所得到的是:

Declare
   mi number(2);
   ma number(2);
BEGIN
   SELECT MIN(ColumnA) INTO mi from TABLEA;
   select MAX(ColumnA) into ma  from TableA;
   FOR a in mi .. ma LOOP
     IF a = 3 THEN
       update TableA SET ColumnB = '0' WHERE ColumnB is null;
       execute immediate 'alter table TableA modify ColumnB not null';
     ELSE
       execute immediate 'alter table TableA modify ColumnB null';
     end if;
   END LOOP;
END;

代码似乎正在直接进入ELSE语句。 columnA的最小值为1,最大值为6.

我相信我在if语句中遗漏了一些东西。

这背后的逻辑是,如果ColumnA包含记录3,那么COLUMN B应该被修改为非空。

2 个答案:

答案 0 :(得分:0)

循环遍历值1 .. 6。

1:null 2:null 3:不是空的 4:null 5:null 6:null

所以columnB设置为“not null”,但之后会直接将其设置回“null”。

答案 1 :(得分:0)

您的代码无法正常运行。

您的代码仅在以下情况下有效:

  • 您的表格中没有columnA = 3和
  • 的记录
  • 对于所有存在的行,columnB的所有值均为空。

想想你写的内容:

  • 如果甚至存在columnA = 3的一条记录,则表示您正在插入 a columnB的非空(' 0')值。

    下次循环运行(循环持续到a = 6),这次a = 4, 控件流向ELSE部分,您正在尝试修改它 与NOT NULL相同的列。你没有自己插入一个' 0'(NOT NULL)值 上一个循环中的这一列?

  • 如果没有columnA = 3的记录,那么您的控件将永远存在 转到其他部分,很明显,如果有任何现有的记录在哪里 columnB不为空,它会抛出相同的错误