2014-04-26 7 views
0

프로 시저에 값 (급여)을 정의하는 함수를 삽입하려고합니다. 이 값은 테이블의 열 (직원)에 삽입해야합니다.oracle에 커서가있는 프로 시저에서 사용자 정의 함수 사용

테이블 (직원)에 삽입 될 다른 모든 값은 다른 테이블에서 데이터를 추출하는 커서 (프로 시저에서)에 의해 정의되지만 마지막 값 (급여)은 커서 대신에 내가 만든 함수로 정의됩니다. 내 프로 시저에 어떻게 추가하여 커서의 데이터를 각각의 열에 넣은 다음 함수가 테이블의 마지막 열에 대한 데이터를 생성합니까?

가 (이 삽입 문에서 값 급여에 필요한 줄 것이다 기능입니다) 도움이된다면 내 절차가

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; 

어떤 아이디어? 대신

+0

: 된 값 (employee_rec.firstname, employee_rec.lastname, employee_rec.Emails, 카운터, employee_rec.Date_created, salary_function (aDateVariable를) ) ; – Michal

+0

이 명령문은 무시되며 열이 허용되지 않는다고 알려줍니다. – LightningBolt

+0

그런 경우에는 어려운 방법으로 할 수 있습니다 :). 함수의 결과를 varchar2 변수에 저장하십시오. 그런 다음 변수를 사용하여 호출의 varchar2 표현을 만들고 EXECUTE IMMEDIATE를 실행합니다. – Michal

답변

0

사용 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; 
이 쓸 경우 무슨 일이 일어날 지
+0

나는 진술 안에 내 첫 번째 값 다음에 오른쪽 괄호가 누락되었다는 오류가 발생했습니다. 여기에 : employee_rec.firstname, 내가 가지고있는 것 : 오류 (32,31) : PL/SQL : ORA-00907 : 오른쪽 괄호가 누락되었습니다. – LightningBolt

+0

@LightningBolt. . . 대답은'insert' 컬럼 목록에 닫는 괄호가 없습니다. –

+0

나는 급여 기능을 유효하지 않은 식별자로 받았는데, 이것이 선언해야 함을 의미합니까? – LightningBolt

관련 문제