1. 程式人生 > >Oracle中執行存儲過程call和exec區別

Oracle中執行存儲過程call和exec區別

completed pro spa 數據 -- gif insert ESS sqlplus命令

在sqlplus中這兩種方法都可以使用:

exec pro_name(參數1..); call pro_name(參數1..);

區別:
1. 但是exec是sqlplus命令,只能在sqlplus中使用;call為SQL命令,沒有限制.

2. 存儲過程沒有參數時,exec可以直接跟過程名(可以省略()),但call則必須帶上().


Sql代碼
SQL> --創建過程 插入數據
SQL> create or replace procedure pro1 is

2 begin --執行部分
3 insert into mytest values(‘張三‘, ‘mm‘);

4 end;

5 /
Procedure created


SQL> exec pro1;
PL/SQL procedure successfully completed


SQL> call pro1;

call pro1
ORA-06576: 不是有效的函數或過程名
SQL> call pro1();
Method called


總結:在調用過程時,應該養成使用call,且要帶上()的習慣。
---------------------

exec是sqlplus的命令,只能在sqlplus中使用。

call是sql命令,任何工具都可以使用,call必須有括號,即例沒有參數

技術分享圖片
call必須有括號,即例沒有參數  
idle> connect /as sysdba  
已連接。  
sys@PO10>   
sys@PO10> create procedure p_test is   
  2  begin  
  3    null;  
  4  end;  
  5  /  
過程已創建。  
sys@PO10>   
sys@PO10> exec p_test  
PL/SQL 過程已成功完成。  
sys@PO10> call p_test  
  2  ;  
call p_test  
     *  
第 1 行出現錯誤:  
ORA-06576: 不是有效的函數或過程名  
sys@PO10> call p_test();  
調用完成。  
sys@PO10>  
exec 只能在SQLPLUS中使用;call可以在任何地方使用 

區別
exec是SQL Plus命令,只能在SQL Plus中使用;call為SQL命令,沒有限制.
存儲過程或函數沒有參數時,exec可以直接跟過程名(可以省略()),但call則必須帶上().
示例
exec
調用存儲過程
有參數:exec mypro(12,‘fsdf‘);
沒有參數:exec mypro;,也可以寫成exec mypro();
調用函數
有參數:var counts number;exec :counts:=myfunc(‘fsde‘);
沒有參數:var counts number;exec :counts:=myfunc;,也可以寫成var counts number;exec :counts:=myfunc();
call
調用存儲過程
有參數:call mypro(23,‘fth‘);
無參數:call mypro();
調用函數
有參數:var counts number;call myfunc(‘asd‘) into :counts;
無參數:var counts number;call myfunc() into :counts;
其他註意事項
oracle 中字符串應該是 ” 而不應該是 “”
每寫完一條sql語句應加上 ;
為了防止call 和 exec 無參數的存儲過程或函數的錯誤,建議全部加上()
---------------------

Oracle中執行存儲過程call和exec區別