2015-08-28 2 views
-1

Я новичок в PLSQL и делаю пару упражнений с использованием Bulk SQL. У меня есть следующий пакет:BULK COLLECT INTO: 'идентификатор' должен быть объявлен

/*Update a commision with a new factor*/ 
FUNCTION commision_pct_update(p_job_id jobs.job_id%type, p_factor NUMBER) RETURN NUMBER; 

и следующее тело:

FUNCTION commision_pct_update(p_job_id jobs.job_id%type, p_factor NUMBER) RETURN NUMBER AS 

BEGIN 

SELECT job_id BULK COLLECT INTO v_employees_tab FROM employees; 

FORALL i IN v_employees_tab.FIRST..v_employees_tab.LAST 
    UPDATE employees SET commission_pct = (commission_pct * p_factor) 
    WHERE commission_pct is not null AND job_id = p_job_id; 
    RETURN SQL%ROWCOUNT; 

END commision_pct_update; 

я получаю следующее сообщение об ошибке в сообщениях журнала. (Я использую Oracle SQL Developer).

Error (43,37): PLS-00201: идентификатор 'V_EMPLOYEES_TAB' должен быть объявлен

Я не знаю, где и как объявить идентификатор в функции.

EDIT:

enter image description here

ответ

1

Вам нужно определить переменную (v_employees_tab) перед BEGIN, и указать его тип ... например:

FUNCTION commision_pct_update(p_job_id jobs.job_id%type, p_factor NUMBER) RETURN NUMBER AS 
    TYPE employees_type IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER; 
    v_employees_tab employees_type; 
BEGIN 
    [...] 

Это тип образца конечно, выберите правильный.

+0

Спасибо, но откуда я знаю правильный тип. Я редактировал свой вопрос с изображением таблицы. – Verhelst

+0

@ XverhelstX Я не уверен, вы делаете некоторые странные вещи здесь: выбор типа из другой таблицы: вы передаете переменную типа из 'jobs.jobs_id' (возможно, целое число), но выбираете строки от 'сотрудника'. Затем вы используете 'forall', но не используете переменную' forall' (которая будет 'i' в вашем случае) в цикле. Проверьте эту статью, она может указать вам направление того, чего вы хотите достичь: http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html – Jcl

+0

* Для чего я понимайте * (что может быть неправильно) из вашего кода, вы могли бы просто сделать с 'update', а не использовать' bulk collect' или 'forall' вообще, но опять же, я не совсем уверен – Jcl