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>
函数必须返回一个我们想要插入到表中的值。它不能返回一些无意义的短语,如“薪水好”。另外,如果我们要验证两列,我们需要为每个列分别设置一个函数,即使它们之间存在关系,我们也使用相同的存储过程来验证它们。很好用于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语句中编写一些奇怪的IF SALARY IS VALID THEN INSERT逻辑。因此,如果存储过程不引发异常,而是返回一些wimpy错误状态,则包装函数将不得不解释输出并抛出它自己的异常。
这是我需要的。谢谢。 – 2010-05-19 12:54:18