使用CALL和EXEC調用存儲過程的區別

转自:http://blog.csdn.net/ngx20080110/article/details/5883471

使用CALL調用存儲過程,不能使用名稱參數,同時也會忽略未處理的ORA-01403:NO DATA FOUND錯誤。而使用EXEC的話,可以使用名稱參數,同時會拋出未處理的ORA-01403,使用BEGIN ... END效果與EXEC相同。例子如下

 

創建一個簡單的存儲過程:

[java] view plain copy print ?
  1. create or replace procedure proc_update_salary(  
  2.   p_emp_id number,   
  3.   p_increment number default 0.1 -- 可以不傳入p_increment的參數值,默認值使用0.1  
  4. )  
  5. is  
  6.   v_old_salary number;  
  7. begin  
  8.   select salary   
  9.   into v_old_salary  
  10.   from employees  
  11.   where employee_id = p_emp_id;  
  12.     
  13.   if v_old_salary < 10000 then  
  14.     update employees   
  15.     set salary = salary + salary * p_increment  
  16.     where employee_id = p_emp_id;  
  17.   end if;  
  18. end;  

create or replace procedure proc_update_salary( p_emp_id number, p_increment number default 0.1 -- 可以不傳入p_increment的參數值,默認值使用0.1 ) is v_old_salary number; begin select salary into v_old_salary from employees where employee_id = p_emp_id; if v_old_salary < 10000 then update employees set salary = salary + salary * p_increment where employee_id = p_emp_id; end if; end;

 

測試

[java] view plain copy print ?
  1. call proc_update_salary(198); -- 正常運行  
  2. call proc_update_salary(19080.2); -- 沒有拋出ORA-01043  
  3. call proc_update_salary(p_emp_id=>198); -- 不能執行,ORA-00907: missing right parenthesis  
  4.   
  5. exec proc_update_salary(p_increment=>0.2, p_emp_id=>1908); -- 可以執行,但拋出ORA-01043  
  6.   
  7. begin  
  8.   proc_update_salary(1980.2); -- 正確運行  
  9. end;  

 

你可能感兴趣的:(使用CALL和EXEC調用存儲過程的區別)