Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在过程中使用用户定义的函数,并将光标放在oracle上_Sql_Oracle_Stored Procedures_User Defined Functions - Fatal编程技术网

Sql 在过程中使用用户定义的函数,并将光标放在oracle上

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

我试图在过程中插入一个定义valuesalary的函数。需要将该值插入tableemployees中的列中

在从另一个表提取数据的过程中,将要插入表Employees的所有其他值都由游标定义,但是最后一个值Salary不在游标上,而是由我创建的函数定义的。如何将其添加到过程中,以便将光标中的数据放入各自的列中,然后函数为表的最后一列创建数据

我的程序是

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;