2015-08-28 62 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