2016-11-15 21 views
1

あなたはやるべきことを分かち合うことができますかIF ELSE内部FORALLIF ELSE内の条件FORALL Oracle

これは正常に機能する現在のコードです。

宣言用。

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; 

MAIN CODE:

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

+0

のですか? –

+0

PL/SQL - ORACLE。申し訳ありませんがタイトルで言及するのを忘れた – shukor

答えて

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 
    ;