在带有 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)

Oracle(变量定义接收用户输入if语句循环语句)

使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程

ORACLE 存储过程光标运行缓慢

oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,

oracle中的存储过程,有啥作用,以及怎么在代码中使用?