Как написать цикл в PL / SQL, который идет по числам - PullRequest
4 голосов
/ 09 июля 2010

Я хочу написать цикл, который перебирает числа 105 102 19 17 101 16 106 107

для каждой итерации. Я хочу вставить число в запрос и вставить его в таблицу.

псевдо:

LOOP (105 102 19 17 101 16 106 107)
   FETCH select * from some_table where value=current_iteration_index --105..etc.
   INTO my_rec_type

END LOOP;

Ответы [ 4 ]

12 голосов
/ 09 июля 2010

Другой метод:

declare
 type numListType is table of number;
 numList numListType;
begin
numList := numListType(
 105,102,19,17,101,16,106,107 
);
for i in numList.FIRST..numList.LAST loop
 -- your usage of element goes here
 dbms_output.put_line(numList(i));
end loop;
end;
/
4 голосов
/ 09 июля 2010

Вот более краткая, хотя и не менее уродливая альтернатива:

DECLARE 
CURSOR C IS
SELECT val 
  FROM (SELECT LEVEL val FROM dual CONNECT BY LEVEL < 1000)
 WHERE val IN (105,102,19,17,101,16,106,107);
BEGIN
  FOR R IN C LOOP
    select * 
     INTO my_rec_type
     from some_table
    where value=R.val; --105..etc.
    ... more stuff
  END LOOP;
END;

Преимущество (IMO) в том, что вам нужно только изменить список IN и, возможно, ограничение в предложении CONNECT BY, чтобы изменить свои результаты.

3 голосов
/ 09 июля 2010

Хотя у вас есть несколько решений для ваших вопросов, но на основе вашего подхода я скажу вам, что я думаю, что вы подходите к этому неправильно - вы не используете преимущества базы данных .

Можете ли вы объяснить, почему

select * from some_table where value in (105, 102, 19, 17, 101, 16, 106, 107)

не делает то, что вы хотите?

1 голос
/ 09 июля 2010

Вот вариант с использованием Cursor FOR LOOP и атрибута % ROWTYPE :

DECLARE

  my_rec_type SOME_TABLE%ROWTYPE;

  CURSOR c IS 
    SELECT 105 AS c_index FROM DUAL
    UNION ALL
    SELECT 102 AS c_index FROM DUAL 
    UNION ALL
    SELECT 19 AS c_index FROM DUAL 
    UNION ALL
    SELECT 17 AS c_index FROM DUAL 
    UNION ALL
    SELECT 101 AS c_index FROM DUAL
    UNION ALL
    SELECT 16 AS c_index FROM DUAL 
    UNION ALL
    SELECT 106 AS c_index FROM DUAL
    UNION ALL
    SELECT 107 AS c_index FROM DUAL

BEGIN

  FOR cursor_rec IN c
  LOOP

     SELECT * 
       INTO my_rec_type
       FROM some_table 
       WHERE value = cursor_rec.c_index;

  END LOOP;

END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...