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

MySQL 5.0 新特性教程:存儲過程 (二) — 合法語句、調用、特性子句

     編輯:MySQL 資料庫相關知識

過程體中合法的 SQL 語句

標準 SQL (核心)

  • DDL:CREATE、DROP、ALTER (資料庫/表/索引/視圖)
  • DML:INSERT、UPDATE、DELETE、REPLACE
  • 查詢:SELECT (標準 SQL 限制較嚴)
  • 交易控制:SET、COMMIT、ROLLBACK
CREATE PROCEDURE p() DELETE FROM t;
CREATE PROCEDURE p() SET @x = 5;

MySQL 擴充功能 (非核心、可選)

  • DDL 於過程體中執行 (標準 SQL 列為非核心)
  • 直接 SELECT 回傳結果集給客戶端
CREATE PROCEDURE p() DROP TABLE t;
CREATE PROCEDURE p() SELECT 'a';

過程體中「非法」語句

  • 建立/修改/刪除其他例程:CREATE/ALTER/DROP PROCEDURE、CREATE/DROP FUNCTION、CREATE/DROP TRIGGER
  • USE database — MySQL 假定預設資料庫即為過程工作場所

但可跨資料庫操作:CREATE PROCEDURE db5.p1() DROP DATABASE db5

調用存儲過程

CALL p1();

括號 必須 保留。效果等同直接執行過程體內的 SQL:

-- 過程體: SELECT * FROM t;
CALL p1();  -- 等同執行 SELECT * FROM t;

特性子句

CREATE PROCEDURE p2()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A Procedure'
SELECT CURRENT_DATE, RAND() FROM t;

子句說明

SQL SECURITY 深度解析

  • DEFINER (預設):建立過程的用戶需有過程體內所有操作的權限;調用者僅需 EXECUTE 權限
  • INVOKER:調用者需有過程體內所有操作的權限;建立者權限不被檢查

善用 DEFINER 可實現「低權限帳號執行高權限操作」的受控委派模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
子句用途備註
LANGUAGE SQL聲明主體語言預設值,為 DB2 相容保留,未來可能支援其他語言
NOT DETERMINISTIC告知優化器:相同輸入可能產生不同輸出含 RAND()、NOW() 等非確定性函數時必須聲明;目前優化器暫不參考
SQL SECURITY DEFINER執行時檢查「建立者」權限預設值;另可選 INVOKER (檢查「調用者」權限)
COMMENT說明文字顯示於 SHOW CREATE PROCEDURE