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

来源:互联网 发布:最佳适应算法例题 编辑:程序博客网 时间:2024/04/25 12:38

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

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

 

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

[java] view plaincopyprint?
  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;  

 

測試

[java] view plaincopyprint?
  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;  

 

原创粉丝点击