Итерация по столбцу в PL / SQL - PullRequest
13 голосов
/ 19 января 2011

У меня есть таблица Emp с EmpID, Empname, Salary, и я пытаюсь сделать расчет для каждого сотрудника.Но у меня возникают проблемы, пытаясь перебрать каждый emp для выполнения расчета.Я не могу использовать явные курсоры.

Так что сейчас я просто пытаюсь создать список empID:

Declare
    aRows Number;
    eid emp_ID%TYPE;
Begin
    Select Count(*)
    Into aRows 
    from emp;

    Select emp_ID
    Into eid 
    From emp;

    FOR days IN 1..Tot_Rows
    Loop
        Dbms_Output.Put_Line(eid);
        eid := eid + 1;
    End Loop;
END; 

Но я получаю ошибку: PLS-00320: объявлениетип этого выражения неполный или искаженный

Ответы [ 2 ]

27 голосов
/ 19 января 2011

Самый простой способ перебора строк в таблице в PL / SQL - сделать что-то вроде

BEGIN
  FOR employees IN (SELECT emp_id FROM emp)
  LOOP
    dbms_output.put_line( employees.emp_id );
  END LOOP;
END;

Альтернативно, вы можете получить все значения EID в коллекцию PL / SQL и выполнить итерациюколлекция, как в этом примере

DECLARE
  TYPE emp_id_tbl IS TABLE OF emp.emp_id%type;
  l_emp_ids emp_id_tbl ;
BEGIN
  SELECT emp_id
    BULK COLLECT INTO l_emp_ids 
    FROM emp;

  FOR i IN l_emp_ids .FIRST .. l_empnos.LAST
  LOOP
    dbms_output.put_line( l_emp_ids (i) );
  END LOOP;
END;

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

4 голосов
/ 19 января 2011

Джастин Кейв объяснил, как это сделать, но специально посмотреть на полученную ошибку, из-за этого:

eid emp_ID%TYPE;

При использовании %TYPE необходимо указать имя таблицы, а также имя столбца:

eid emp.emp_ID%TYPE;

Если вы выбираете все столбцы в строке, вы также можете посмотреть на %ROWTYPE.

Ваш подход также делал два предположения: первоначальный выбор в eid нашел самый низкий идентификатор, что никоим образом не гарантировано; и что все последующие значения идентификатора являются последовательными. И вы объявляете и заполняете aRows, но ссылаетесь на Tot_Rows.

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