2015-01-06 4 views
2

Я написал следующую процедуру оракула, чтобы получать данные навалом и обрабатывать их в блоках. Я использую опцию массового сбора с ограничением для извлечения данных. Но внутри цикла я не могу получить ORD_ID. Я пытаюсь вывести ORD_ID с помощьюOracle PLSQL BULK Collect and For Loop

DBMS_OUTPUT.put_line(l_orders(indx)); 

Но получаю ошибку компиляции «неверный номер или тип аргументов в вызове" PUT_LINE»

create or replace PROCEDURE TESTPROC AS 

CURSOR order_id_cur IS SELECT ORD_ID FROM orders ORDER BY ORD_ID ASC; 
l_order_id VARCHAR2(100); 
TYPE orders_aat IS TABLE OF order_id_cur%ROWTYPE; 
l_orders orders_aat; 
limit_in NUMBER  :=10; 
batch_in NUMBER :=0; 


BEGIN 
    OPEN order_id_cur; 
    LOOP 
    FETCH order_id_cur 
     BULK COLLECT INTO l_orders LIMIT limit_in; 
    DBMS_OUTPUT.put_line('Batch-----'||batch_in); 
    FOR indx IN 1 .. l_orders.COUNT 
    LOOP 
     DBMS_OUTPUT.put_line(indx); 
     DBMS_OUTPUT.put_line(l_orders(indx)); 
    END LOOP; 

    EXIT WHEN l_orders.COUNT < limit_in; 
    batch_in := batch_in+1; 
    END LOOP; 
    CLOSE order_id_cur; 
END TESTPROC; 

Как я могу получить значения ORD_ID внутри для цикла.

ответ

3

ли это так -

DBMS_OUTPUT.put_line(l_orders(indx).ORD_ID);

Например,

SQL> DECLARE 
    2 type t 
    3 IS 
    4 TABLE OF emp%rowtype; 
    5 a t; 
    6 BEGIN 
    7 SELECT * BULK COLLECT INTO a FROM emp; 
    8 FOR i IN 1..a.count 
    9 LOOP 
10  dbms_output.put_line (a(i).ename); 
11 END LOOP; 
12 END; 
13/
SMITH 
ALLEN 
WARD 
JONES 
MARTIN 
BLAKE 
CLARK 
SCOTT 
KING 
TURNER 
ADAMS 
JAMES 
FORD 
MILLER 

PL/SQL procedure successfully completed. 

SQL> 
+1

Спасибо ... Я пытался другим способом l_orders.ORD_ID (indx) – Andromeda

+0

Добро пожаловать! –

+0

Еще одно сомнение ... возможно ли сразу получить все ORD_ID вместо использования для цикла и итерации через каждый. в основном я хочу использовать все ord_ids в операторе IN ...eg 'delete from orders_bckup где ord_id in (allOrderIds)' – Andromeda

0

вы также можете сделать петлю непосредственно курсор, как показано ниже

FOR recc in order_id_cur 
    LOOP 
     DBMS_OUTPUT.put_line(recc.ORD_ID); 
    END LOOP; 
Смежные вопросы