2011-01-18 3 views
11

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

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

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: заявление типа этого выражения является неполным или неправильно

ответ

24

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

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

в качестве альтернативы, вы можете принести все ВИЗ значения в коллекции в 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. Но это, казалось бы, опережает нас в этот момент.

+0

спасибо за помощь Джастину, но когда я запускаю свой первый код, но вывод dbms (eid) not (employees.eid), он не выводит его в outb dbms. Ты знаешь почему? – Leo

+0

@ Leo- Какой инструмент вы используете? В SQL * Plus вам нужно выполнить команду SET SERVEROUTPUT ON, чтобы включить вывод DBMS_OUTPUT. –

+0

@Leo: если вы сохранили раздел 'declare', то' eid' не может быть инициализирован, поэтому он будет печатать нуль - при условии, что вы включили сервер. @Justin, нужно ли иметь 'dbms_output.put_line (used.emp_id)' или псевдоним столбца в курсоре? –

4

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

eid emp_ID%TYPE; 

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

eid emp.emp_ID%TYPE; 

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

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

Смежные вопросы