FORALL Oracle 中的 IF ELSE 条件

Posted

技术标签:

【中文标题】FORALL Oracle 中的 IF ELSE 条件【英文标题】:IF ELSE Condition inside FORALL Oracle 【发布时间】:2016-11-15 08:36:43 【问题描述】:

你们能分享一下IF ELSEFORALL里面怎么做吗?

这是我当前运行良好的代码。

用于声明;

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 将结果集放入 FORALL 中的变量中

Oracle 中的 if(condition, then, else)

oracle报告IF ELSE中的sql查询条件

oracle存储过程中的if...elseif...else用法

ORACLE 中的 PL/SQL、IF-ELSE 或 SELECT DECODE 哪个更好

关于Oracle if elsif else