FORALL Oracle 中的 IF ELSE 条件
Posted
技术标签:
【中文标题】FORALL Oracle 中的 IF ELSE 条件【英文标题】:IF ELSE Condition inside FORALL Oracle 【发布时间】:2016-11-15 08:36:43 【问题描述】:你们能分享一下IF ELSE在FORALL里面怎么做吗?
这是我当前运行良好的代码。
用于声明;
TYPE t_column1 IS TABLE OF USERS.column1%TYPE;
TYPE t_column2 IS TABLE OF USERS.column1%TYPE;
arr_column1 t_column1;
arr_column2 t_column2;
TYPE t_columnA IS TABLE OF ADDRESS.columnA%TYPE;
TYPE t_columnB IS TABLE OF ADDRESS.columnA%TYPE;
arr_columnA t_columnA := t_columnA();
arr_columnB t_columnB := t_columnB();
CURSOR cur IS
SELECT column1,column2
FROM USERS;
i INTEGER;
l_done BOOLEAN;
indx INTEGER;
主要代码:
OPEN cur;
LOOP
FETCH cur BULK COLLECT INTO
arr_column1, arr_column2
LIMIT 10000;
l_done := curRESALEMASTER%NOTFOUND;
FOR indx IN 1 .. arr_column1.COUNT
LOOP
arr_columnA.extend;
arr_columnB.extend;
arr_columnA(indx) := arr_column1(indx);
arr_columnB(indx) := 'XYZ';
END LOOP;
FORALL i IN 1 .. arr_column1.COUNT
INSERT INTO ADDRESS partition VALUES (
arr_columnA(i),
arr_columnB(i),
arr_column2(i);
EXIT WHEN (l_done);
END LOOP;
COMMIT;
CLOSE cur;
所以我的问题是如何为 FORALL 设置条件?
会是这样的:
FORALL i IN 1 .. arr_column1.COUNT
IF arr_columnA(indx) <> NULL THEN
INSERT INTO ADDRESS partition VALUES (
arr_columnA(i),
arr_columnB(i),
arr_column2(i);
END IF;
但是我不能把条件放在 FORALL 里面
【问题讨论】:
这是什么编程语言? PL/SQL - ORACLE。抱歉忘记在标题中提及 【参考方案1】:首先,您不能将 NULL 与变量进行比较。 你必须使用
IS [NOT] NULL
要回答你的问题,我会试试这个:
FORALL i IN arr_column1.FIRST .. arr_column1.LAST
INSERT INTO ADDRESS partition
SELECT
arr_columnA(i),
arr_columnB(i),
arr_column2(i)
FROM DUAL
WHERE arr_columnA(indx) IS NOT NULL
;
【讨论】:
【参考方案2】:或者您可以尝试将 IF 语句放在外面,然后像这样执行 FORALL:
IF arr_columnA(indx) IS NOT NULL THEN
FORALL i IN arr_columnl.FIRST .. arr_column.LAST
INSERT INTO ADDRESS partition
SELECT
arr_columnA(i),
arr_columnB(i),
arr_column2(i)
FROM DUAL
END IF;
【讨论】:
以上是关于FORALL Oracle 中的 IF ELSE 条件的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 中的 if(condition, then, else)
oracle存储过程中的if...elseif...else用法