Поместите оператор выбора в цикл for - sql - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть оператор выбора для таблицы, но я хочу запустить его построчно в цикле for.Пробовал связывать переменные и т.д., но это не решает проблему.Какие-либо предложения?

Вот мой код:

Предположим, мне нужно печатать column1 из таблицы строка за строкой.Но я получаю сообщение об ошибке - строка переменной привязки не определена.Какой правильный путь?

DECLARE
  A NUMBER (2);
  R1 NUMBER(2);
  LINE VARCHAR(1000);
BEGIN
  SELECT MAX(ROWNUM) 
  INTO R1 
  FROM TABLE1 
  <<R_LOOP>> 
  FOR I IN 1...R1 LOOP
    INSERT INTO LINE 
    SELECT COLUMN1 
    FROM TABLE1 
    WHERE ROWNUN=I 
    DBMS_OUTPUT.PUT_LINE(LINE)
  END LOOP R_LOOP 
END; 
/

Ответы [ 3 ]

0 голосов
/ 10 апреля 2019

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

declare
cursor c1 is <select column1 statement>;
...
begin
...
for rec in c1
loop
.......
insert into LINE values (rec.column1);
......
end loop;
commit;
end;

все операторы цикла выполняются только по записи.

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

 SELECT COLUMN1 
    FROM TABLE1 
    WHERE ROWNUN=I 

это будет возвращать значение только тогда, когда rownum = 1 .... когда у нас есть другие условия, такие как rownum = 2, rownum = 3 ....., он не вернет никаких результатов, если у таблицы нет имени столбца 'ROWNUM '.. Rownum - это динамически генерируемый на основе результатов, извлекаемых курсором выбора, и, следовательно, прямая выборка, например, rownum = 2, не выполняется, где вы можете иметь значение rownum <= 2 и работать вокруг ... я предлагаю использовать циклфункциональность для записи по операциям записи ... </p>

0 голосов
/ 10 апреля 2019

Я надеюсь, что вы можете достичь этого, используя пункт returning, как показано ниже.Надеюсь, это поможет.

    DECLARE
      A NUMBER (2);
      R1 NUMBER(2);
      TYPE t_tab IS TABLE OF LINE.COLUMN1%TYPE;
      l_tab t_tab;
    BEGIN
      SELECT MAX(ROWNUM)+1
      INTO R1 
      FROM TABLE1;
        INSERT INTO LINE 
        SELECT COLUMN1 
        FROM TABLE1 
        WHERE ROWNUM < R1
        RETURNING COLUMN1  BULK COLLECT INTO l_tab;

       FOR i IN l_tab.first .. l_tab.last LOOP
        DBMS_OUTPUT.put_line(l_tab(i));
       END LOOP;    
       END; 
       /
0 голосов
/ 10 апреля 2019

Вы ищете CURSOR, это объект, который просматривает вашу таблицу за строкой.

cursor c1 IS
SELECT column1, column2 FROM ... ;

OPEN c1;
LOOP
    FETCH c1 INTO column1_c, column2_c;

        ...

    EXIT WHEN c1%NOTFOUND;
END LOOP;

Я не уверен на 100% в синтаксисе вашей RDBMS.Может быть, вы можете найти больше в документации разработчика SQL.

Документация

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