2015-08-28 40 views
-1

我是PLSQL的新手,並使用Bulk SQL進行了一些練習。 我有以下的包:BULK COLLECT INTO:'identifier'必須聲明

/*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)。

錯誤(43,37):PLS-00201:標識符 'V_EMPLOYEES_TAB' 必須聲明爲

我不知道在哪裏或如何聲明在函數中的標識符。

編輯:

enter image description here

回答

1

您需要BEGIN之前定義的變量(v_employees_tab),並註明其類型...例如:

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