Sql FOR-IN循环中的IF-ELSE语句在oracle中不起作用
嗨,伙计们,我一直在尝试实现将表数据从null更改为notnull的简单代码。到目前为止,我想到的是: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
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”。您的代码不太可能工作。 只有在以下情况下,您的代码才能工作:
- 表中没有
=3的记录,并且列a
- 对于存在的所有行,
的所有值都为空columnB
- 如果存在一条
=3的记录,则插入列a
的非空('0')值 下次循环运行时(循环持续到a=6),此时a=4, 控件流到列B
part,您正试图修改它 与ELSE
。您自己没有向中插入“0”(相同的列不为空
)值吗 上一个循环中的此列非NULL
- 如果没有
=3的记录,则控件将始终 转到其他部分,显然,如果有任何现有记录列a
不为null,它将抛出相同的错误columnB
a
>3?当前TableA设置为空,错误为ORA_01451:要修改为空的列显然不能修改为空。不相关,但您不需要两个查询:从TableA中选择MIN(ColumnA)、max(ColumnA)进入mi、ma代码>更有效。实际上,我认为你甚至不需要来进行循环-一次更新或合并就足够了。@user3318414为什么?对你来说很明显的东西对其他人来说并不明显,因为我们没有你的数据。请将示例输入数据添加到显示问题的帖子中。我相信如果a=3,则无法正常工作。您好,谢谢您,我删除了else语句,代码正常工作。它正在将列设置为非空