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 오류 상태를 반환하는 경우 래핑 함수는 출력을 해석하고 자체 예외를 던져야합니다.
내가 필요한 것입니다. 감사. –