在带有 oracle 光标的过程中使用用户定义的函数
Posted
技术标签:
【中文标题】在带有 oracle 光标的过程中使用用户定义的函数【英文标题】:Using a user defined function inside a procedure with a cursor on oracle 【发布时间】:2014-04-26 21:03:05 【问题描述】:我正在尝试将定义值(薪水)的函数插入到过程中。该值需要插入到表(员工)的列中。
将要插入到表中的所有其他值(员工)都由游标(在过程中)定义,游标从另一个表中提取数据,但是最后一个值(工资)不在游标上,但由我创建的函数定义。如何将它添加到我的过程中,以便将光标中的数据放入各自的列中,然后该函数为表的最后一列创建数据?
我的程序是
create or replace
PROCEDURE migratestuff
IS
CURSOR names_cursor
IS
select substr(staff.name, 0, instr(staff.name, ' ') - 1) as firstname,
substr(staff.name, instr(staff.name, ' ') + 1) as lastname,
lower(concat(substr(staff.name, 0,1), substr(staff.name, instr(staff.name, ' ') + 1)||'@mail.com')) as emails,
date_created
from staff;
employee_rec names_cursor%rowtype;
counter number := 1;
BEGIN
FOR employee_rec IN names_cursor
LOOP
INSERT INTO employee
(fname, lname,Email,emp_ID,hire_date,salary
) VALUES
(employee_rec.firstname, employee_rec.lastname,employee_rec.Emails,counter,
employee_rec.Date_created,SALARYFUNCTIONRESULTHERE
);
commit;
counter := counter +1;
END LOOP;
end;
如果有帮助,我的函数(这是在插入语句中给出值薪水的函数):
CREATE OR REPLACE
FUNCTION salary_function(
in_date IN DATE)
RETURN NUMBER
IS
salary_out NUMBER(5);
BEGIN
IF to_char(in_date, 'YYYY') = '2013' THEN
salary_out :=7000;
ELSE
IF to_char(in_date, 'YYYY') = '2014' THEN
salary_out := 6000;
ELSE
IF to_char(in_date, 'YYYY') = '2015' THEN
salary_out := 5000;
END IF;
END IF;
END IF;
RETURN salary_out;
END;
有什么想法吗?
【问题讨论】:
如果你这样写会发生什么:VALUES (employee_rec.firstname, employee_rec.lastname,employee_rec.Emails,counter, employee_rec.Date_created,salary_function(aDateVariable)); 它忽略了该语句,并告诉我该列不允许存在。 好吧,在这种情况下,您可以通过艰难的方式做到这一点:)。将函数的结果存储在 varchar2 变量中。然后使用变量创建调用的 varchar2 表示并运行 EXECUTE IMMEDIATE。 你的意思是我应该用一个值调用函数,然后将它存储并用作过程中的变量吗?感谢您的帮助 【参考方案1】:改用insert . . . select
:
INSERT INTO employee(fname, lname, Email, emp_ID, hire_date, salary)
SELECT employee_rec.firstname, employee_rec.lastname, employee_rec.Emails, counter,
employee_rec.Date_created, SALARYFUNCTIONRESULTHERE
FROM dual;
【讨论】:
我收到一条错误消息,提示我在语句中的第一个值之后缺少右括号。这里:employee_rec.firstname,我得到了这个:错误(32,31):PL/SQL:ORA-00907:缺少右括号 @LightningBolt 。 . .答案是缺少insert
列列表中的右括号。
我得到了salary函数作为一个无效的标识符,这是否意味着我需要声明它?
@LightningBolt 。 . .您需要在执行此代码之前定义/声明它。以上是关于在带有 oracle 光标的过程中使用用户定义的函数的主要内容,如果未能解决你的问题,请参考以下文章
存储过程中的光标完成并卡住(Oracle Linux VM 上的 Oracle 11g)
使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程