Sql 在过程中使用用户定义的函数,并将光标放在oracle上
我试图在过程中插入一个定义valuesalary的函数。需要将该值插入tableemployees中的列中 在从另一个表提取数据的过程中,将要插入表Employees的所有其他值都由游标定义,但是最后一个值Salary不在游标上,而是由我创建的函数定义的。如何将其添加到过程中,以便将光标中的数据放入各自的列中,然后函数为表的最后一列创建数据 我的程序是Sql 在过程中使用用户定义的函数,并将光标放在oracle上,sql,oracle,stored-procedures,user-defined-functions,Sql,Oracle,Stored Procedures,User Defined Functions,我试图在过程中插入一个定义valuesalary的函数。需要将该值插入tableemployees中的列中 在从另一个表提取数据的过程中,将要插入表Employees的所有其他值都由游标定义,但是最后一个值Salary不在游标上,而是由我创建的函数定义的。如何将其添加到过程中,以便将光标中的数据放入各自的列中,然后函数为表的最后一列创建数据 我的程序是 create or replace PROCEDURE migratestuff IS CURSOR names_cursor IS
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;
My function if helps此函数将在insert语句中给出薪资所需的值:
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;
有什么想法吗?使用插入。改为选择:
如果您这样写会发生什么:value employee\u rec.firstname、employee\u rec.lastname、employee\u rec.email、counter、employee\u rec.Date\u created、salary\u functionalDateVariable;它忽略了该语句,并告诉我该列不允许出现在那里。在这种情况下,您可以通过艰难的方式来实现:。将函数结果存储在varchar2变量中。然后使用变量创建调用的varchar2表示形式并运行EXECUTE IMMEDIATE。对于结果,您的意思是我应该使用一个值调用函数,然后在过程中存储并使用该值作为变量吗?谢谢你的帮助,我收到一个错误,说我在语句中的第一个值后面缺少右括号。这里:employee_rec.firstname,我得到这个:Error32,31:PL/SQL:ORA-00907:missing rightparenthesis@LightningBolt . . . 答案是插入的列列表中缺少结束符。我将salary函数作为无效标识符获取,这是否意味着我需要声明它?@LightningBolt。您需要在执行此代码之前定义/声明它。
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;