首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle CALL 與 EXEC 差異深度解析:工具相容性與語法規則

     編輯:Oracle 資料庫相關知識

前言

在 Oracle 開發中,EXEC 與 CALL 皆可執行預存程序,但兩者適用場景、語法規則與工具相容性存在顯著差異。本文通過實測對比,為您釐清核心區別。

核心差異速覽

維度EXEC / EXECUTECALL
本質SQL*Plus 專屬命令SQL 標準語句
適用工具僅限 SQL*Plus、SQLcl所有支援 SQL 的客戶端(PL/SQL Developer、SQL Developer、JDBC、ODBC 等)
括號規則無參數時可省略括號必須保留括號,無參數亦需寫 ()
回傳值處理不支援函數回傳值接收可搭配 INTO 子句接收函數回傳值
事務控制隱含提交行為視工具而定符合 SQL 標準事務語義

實測案例

環境準備

CREATE PROCEDURE p_test IS
BEGIN
  NULL;
END;
/

1. SQL*Plus 環境下測試

SQL> EXEC p_test;
PL/SQL 過程已成功完成。

SQL> CALL p_test();
呼叫完成。

SQL> CALL p_test;
ERROR at line 1:
ORA-06576: not a valid function or procedure name

結論:SQL*Plus 兩者皆可用,但 CALL 必須帶括號。

2. PL/SQL Developer / SQL Developer 環境

-- 僅 CALL 可用
CALL p_test();  -- 成功
EXEC p_test;    -- 報錯:ORA-00900: invalid SQL statement

3. 無參數函數回傳值測試

CREATE FUNCTION f_get_date RETURN DATE IS
BEGIN
  RETURN SYSDATE;
END;
/

-- CALL 可接收回傳值
VARIABLE v_date VARCHAR2(30);
CALL f_get_date() INTO :v_date;
PRINT v_date;

-- EXEC 無法直接接收函數回傳值
-- 需改用匿名區塊:EXEC :v_date := f_get_date();

最佳實踐建議

  1. 跨工具腳本:統一使用 CALL proc_name();,確保在 SQL*Plus、PL/SQL Dev、應用程式中皆可執行。
  2. SQL*Plus 互動操作:EXEC 輸入較簡短,適合臨時測試。
  3. 函數調用:必須使用 CALL func() INTO :bind_var; 或匿名區塊。
  4. JDBC/ODBC 應用:僅能使用 {CALL proc_name(?)} 或 {? = CALL func()} 語法。

常見誤區

  • 誤以為 EXEC 是 SQL 標準 → 實為 SQL*Plus 專屬命令,不可用於應用程式 SQL。
  • 忽略 CALL 的強制括號要求 → 導致 ORA-06576 錯誤。
  • 嘗試用 EXEC 調用函數並接收返回值 → 不支援,需改寫。

總結

EXEC 是 SQL*Plus 的便捷命令,CALL 則是標準 SQL 呼叫語句。編寫需部署至應用或多工具環境的腳本時,請優先使用 CALL 並帶上括號,以確保最大相容性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved