2010-05-19 5 views
13

쿼리 (SELECT) 작업 중이므로이 결과를 테이블에 삽입해야합니다. 삽입을하기 전에 몇 가지 점검을해야하며, 모든 열이 유효하면 삽입을 수행 할 것입니다.select 내부 저장 프로 시저 호출 oracle 호출

확인은 저장 프로 시저에서 수행됩니다. 동일한 절차가 다른 곳에서도 사용됩니다. 그래서 수표를 만들기 위해 동일한 절차를 사용하고 있다고 생각합니다.

절차는 검사를 수행하고 값을 모두 삽입해도 문제가 없습니다.

SELECT 내에서 프로 시저를 호출하기 위해 tryied하지만 작동하지 않습니다.

SELECT field1, field2, myproc(field1, field2) 

from MYTABLE. 

이러한 종류의 코드는 작동하지 않습니다.

커서를 사용하여 수행 할 수 있다고 생각하지만 커서를 피하고 싶습니다. 가장 쉬운 해결책을 찾고 있습니다.

아무도 없습니까?

답변

25

은 PL/SQL 루프를 사용

BEGIN 
    FOR c IN (SELECT field1, field2 FROM mytable) LOOP 
     my_proc(c.field1, c.field2); 
    END LOOP; 
END; 
+0

내가 필요한 것입니다. 감사. –

0

SELECT 문에 저장 프로 시저를 사용할 수 없습니다. 그 기능을 사용할 수 있습니다.

SP에서 insert를 호출하는 것으로 알고 있으므로 함수 본문에서 INSERT/UPDATE를 사용할 수 있다는 점을 고려하십시오. 그러나 일부 검사를 수행해야하는 경우 검사를 수행 할 함수를 사용하고 select 문에서 해당 함수를 사용할 수 있습니다.

+0

네, 이것이 궁극적 인 해결책이 될 것입니다. 그러나 큰 프로젝트의 일부이기 때문에 기존 SP를 사용하고 싶습니다. 새로운 기능을 수행하고 싶지 않습니다. 그것은 mantain하는 것이 더 어려울 것입니다. –

6

SQL 만 프로젝션 기능을 사용할 수 있습니다 : 그것은 값을 반환 무언가를 필요로한다. 따라서 몇 가지 기능을 작성해야합니다. 그것은 나쁜 소식입니다. 좋은 소식은 저장 프로 시저의 모든 투자를 다시 사용할 수 있다는 것입니다.

다음은 완전히 비즈니스 규칙 만 적용하는 절차입니다. 관리자 만 높은 봉급을받을 수 있습니다.

SQL> create or replace procedure salary_rule 
    2  (p_sal in emp.sal%type 
    3  , p_job in emp.job%type) 
    4 is 
    5  x_sal exception; 
    6 begin 
    7  if p_sal > 4999 and p_job != 'MANAGER' then 
    8   raise x_sal; 
    9  end if; 
10 exception 
11  when x_sal then 
12   raise_application_error(-20000, 'Only managers can earn that much!'); 
13 end salary_rule; 
14/

Procedure created. 

SQL> 

프로 시저이므로 SELECT 문에서 사용할 수 없습니다. 우리는 그것을 함수로 감쌀 필요가있다. 이 함수는 단지 저장 프로 시저를 호출합니다. 입력 매개 변수 P_SAL을 반환합니다. 즉, 급여가 유효한 경우 (규칙에 따라) 급여가 반환됩니다. 그렇지 않으면 함수는 저장 프로 시저의 예외를 다시 처리합니다.

SQL> create or replace function validate_salary 
    2  (p_sal in emp.sal%type 
    3  , p_job in emp.job%type) 
    4  return emp.sal%type 
    5 is 
    6 begin 
    7  salary_rule(p_sal, p_job); 
    8  return p_sal; 
    9 end validate_salary; 
10/

Function created. 

SQL> 

이 함수는 테이블에 삽입 할 값을 반환해야합니다. "salary okay"와 같은 의미없는 구문을 반환 할 수 없습니다. 또한 두 열의 유효성을 검사하려는 경우 각 열에 대해 별도의 함수가 필요합니다. 두 열 간의 관계가 있어도 동일한 저장 프로 시저를 사용하여 두 열의 유효성을 검사합니다. DETERMINISTIC 키워드에 유용합니다. 배관공 5000 spondulicks ....

SQL> insert into emp 
    2  (empno 
    3  , ename 
    4  , job 
    5  , deptno 
    6  , sal) 
    7 select 
    8  emp_seq.nextval 
    9  , 'HALL' 
10  , 'PLUMBER' 
11  , 60 
12  , validate_salary(5000, 'PLUMBER') 
13 from dual 
14/
    , validate_salary(5000, 'PLUMBER') 
     * 
ERROR at line 12: 
ORA-20000: Only managers can earn that much! 
ORA-06512: at "APC.SALARY_RULE", line 12 
ORA-06512: at "APC.VALIDATE_SALARY", line 7 


SQL> 

을 얻을 수 없습니다 ...하지만 관리자는 (그들이 그것을받을 자격이 있기 때문에) 할 수 있습니다 : 여기

시험의

SQL> insert into emp 
    2  (empno 
    3  , ename 
    4  , job 
    5  , deptno 
    6  , sal) 
    7 select 
    8  emp_seq.nextval 
    9  , 'HALL' 
10  , 'MANAGER' 
11  , 60 
12  , validate_salary(5000, 'MANAGER') 
13 from dual 
14/

1 row created. 

SQL> 

참고가 던진 예외는 있음 이 일에 결정적입니다.우리는 우리 SQL 문에 INSERT 논리가 약간 이상한 IF SALARY IS VALID THEN INSERT 논리를 쓸 수 없습니다. 따라서 저장 프로 시저가 예외를 발생시키지 않고 wimpy 오류 상태를 반환하는 경우 래핑 함수는 출력을 해석하고 자체 예외를 던져야합니다.

+0

실제로 내 저장 프로 시저가 삽입 작업을 수행합니다. 그래서 select에 insert를 사용할 수 없습니다. –

관련 문제