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

Sql FOR-IN循环中的IF-ELSE语句在oracle中不起作用,sql,oracle,if-statement,for-loop,Sql,Oracle,If Statement,For Loop,嗨,伙计们,我一直在尝试实现将表数据从null更改为notnull的简单代码。到目前为止,我想到的是: 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 Ta

嗨,伙计们,我一直在尝试实现将表数据从null更改为notnull的简单代码。到目前为止,我想到的是:

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声明中遗漏了一些东西


这背后的逻辑是,如果列A包含记录3,则列B应修改为非空。

循环通过值1。。六,

1:null 2:null 3:不为空 4:null 5:null 6:null


因此columnB被设置为“NOTNULL”,但之后它会直接被设置回“null”。

您的代码不太可能工作。

只有在以下情况下,您的代码才能工作:

  • 表中没有
    列a
    =3的记录,并且
  • 对于存在的所有行,
    columnB
    的所有值都为空
想想你写的东西:

  • 如果存在一条
    列a
    =3的记录,则插入
    列B
    的非空('0')值

    下次循环运行时(循环持续到a=6),此时a=4, 控件流到
    ELSE
    part,您正试图修改它 与
    相同的列不为空
    。您自己没有向中插入“0”(
    非NULL
    )值吗 上一个循环中的此列

  • 如果没有
    列a
    =3的记录,则控件将始终 转到其他部分,显然,如果有任何现有记录
    columnB
    不为null,它将抛出相同的错误

错误是什么?它给出了错误或错误?您的代码看起来很好。表中的数据是什么?Can
a
>3?当前TableA设置为空,错误为ORA_01451:要修改为空的列显然不能修改为空。不相关,但您不需要两个查询:
从TableA中选择MIN(ColumnA)、max(ColumnA)进入mi、ma更有效。实际上,我认为你甚至不需要
来进行
循环-一次
更新
合并
就足够了。@user3318414为什么?对你来说很明显的东西对其他人来说并不明显,因为我们没有你的数据。请将示例输入数据添加到显示问题的帖子中。我相信如果a=3,则无法正常工作。您好,谢谢您,我删除了else语句,代码正常工作。它正在将列设置为非空