通常,在使用關聯式資料庫時,您會發出單獨的結構化查詢語言 (SQL) 查詢來檢索或操作數據,例如 SELECT、INSERT、UPDATE 或 DELETE, 直接從您的應用程式程式碼。這些聲明適用於 並直接操作底層資料庫表。如果一樣的話 語句或語句組在多個應用程式中使用 存取同一個資料庫,它們經常在單獨的資料庫中重複 應用程式.
MySQL,與許多其他關係型資料庫管理系統類似, 支援使用預存程序。預存程序幫助第一組 或多個 SQL 語句以通用名稱重複使用,封裝 資料庫本身內的通用業務邏輯。這樣的程序可以 從存取資料庫的應用程式呼叫以檢索或 以一致的方式操作資料。
使用預存程序,您可以為常見的情況建立可重複使用的例程 跨多個應用程式使用的任務,提供資料驗證, 或透過限制來提供額外的資料存取安全層 資料庫使用者直接存取底層表並發出 任意查詢。
在本教程中,您將了解什麼是預存程序以及如何 建立返回資料並使用輸入和資料的基本預存程序 輸出參數。
在本節中,您將連接到 MySQL 伺服器並建立一個 範例資料庫,以便您可以按照本指南中的範例進行操作。
在本指南中,您將使用一個虛構的汽車集合。您將儲存 有關當前擁有的汽車的詳細信息,包括其品牌、型號、製造年份,
如果您的SQL 資料庫系統在遠端伺服器上運行,請從本機電腦SSH 到您的伺服器:
ssh sammy@your_server_ip
然後開啟MySQL 伺服器提示,將sammy 替換為您的MySQL使用者名稱account:
mysql -u sammy-p
建立一個資料庫,名稱為procedures:
CREATE DATABASEprocedures;
如果資料庫建立成功,您將收到以下輸出:
OutputQuery OK, 1 row affected (0.01 sec)
選擇程式資料庫,執行以下USE 語句:
USEprocedures;
您將收到以下輸出:
ssh sammy@your_server_ip
選擇資料庫後,您可以在其中建立範例表。表 cars 將包含有關資料庫中汽車的簡化資料。它將包含以下列:
使用以下指令建立範例表:
mysql -u sammy-p
如果輸出如下列印後,表格已建立:
CREATE DATABASEprocedures;
接下來,透過執行以下INSERT INTO 操作向cars表格載入一些範例資料:
OutputQuery OK, 1 row affected (0.01 sec)
插入 該行動將在表中添加十輛樣品跑車,其中五輛 保時捷和五款法拉利車款。以下輸出顯示所有 新增了五行:
ssh sammy@your_server_ip
至此,您就可以按照指南的其餘部分進行操作並開始在 SQL 中使用預存程序。
MySQL 和許多其他關係型資料庫中的預存程序 系統是包含一個或多個佈局指令的命名對象 然後在調用時由資料庫依序執行。在 最基本的例子,預存程序可以保存一個通用的語句 可重複使用的例程,例如從資料庫擷取數據 經常使用的過濾器。例如,您可以建立一個預存程序來 檢索在最後給定時間內下訂單的線上商店客戶 月數。在最複雜的場景中,預存程序可以 代表描述複雜業務邏輯的廣泛程序 健壯的應用程式。
預存程序中的指令集可以包含傳回或操作資料的常見 SQL 語句,例如 SELECT 或 INSERT 查詢。此外,預存程序可以利用:
當透過名稱呼叫過程時,資料庫引擎會依照定義逐條指令執行它。
資料庫使用者必須具有適當的執行權限 給定的程序。此權限要求提供了一層 安全性,禁止直接資料庫訪問,同時授予使用者存取權限 確保安全執行的各個過程。
預存程序直接在資料庫伺服器上執行, 在本地執行所有計算並將結果傳回給呼叫者 僅當完成時才使用。
如果您想更改過程行為,您可以更新 資料庫中的過程,以及正在使用它的應用程式 自動選擇新版本。所有用戶將立即開始 使用新的程式碼而不需要調整它們
以下是用來建立預存程序的 SQL 程式碼的一般結構:
mysql -u sammy-p
此程式碼片段中的第一個和最後一個指令是 DELIMITER // 和 DELIMITER ;。通常,MySQL使用分號符號(;) 分隔語句並指示它們何時開始和結束。如果你 在 MySQL 控制台中執行多個語句,以 分隔 分號,它們將被視為單獨的命令並執行 各自獨立,一個接一個。然而,儲存過程可以 包含多個命令,這些命令將在執行時按順序執行 被叫。當試圖告訴 MySQL 創建時,這會帶來困難 一個新的程序。資料庫引擎會遇到分號 在儲存過程主體中並認為它應該停止執行 陳述。在這種情況下,預期的陳述是整個 過程創建程式碼,而不是過程中的單一指令
要解決此限制,您可以使用 DELIMITER 命令暫時將分隔符號從 ; 變更為 ; 本身,因此 MySQL 會誤解您的意圖。 // 在 CREATE PROCEDURE 期間 稱呼。然後,儲存過程主體內的所有分號都將是 按原樣傳遞到伺服器。整個程序完成後, 分隔符號改回 ;最後一個 DELIMITER ;.
建立新過程的程式碼的核心是 CREATE PROCEDURE 調用,後跟過程名稱: procedure_name 在範例中。過程名稱後面跟著一個可選的列表 過程將接受的參數。最後一部分是程序 正文,包含在 BEGIN 和 END 語句中。裡面是過程程式碼,其中可以包含單一 SQL 語句,例如 SELECT 查詢或更複雜的程式碼。
END 指令以臨時分隔符號 // 結尾,而不是典型的分號。
在下一節中,您將建立一個不包含單一查詢的參數的基本預存程序。
在本節中,您將建立第一個預存程序,該程序封裝單一SQL SELECT 語句,以傳回依品牌和價值降序排列的自有汽車清單。
開始於執行您要使用的 SELECT語句:
ssh sammy@your_server_ip
資料庫將傳回以下位置的汽車清單汽車表,先按品牌排序,然後在單一品牌內依價值降序排列:
mysql -u sammy-p
最有價值的法拉利位於清單頂部,最不值錢的保時捷出現在
假設此查詢將在多個應用程式中頻繁使用或 由多個用戶使用,並假設您希望確保每個人都會使用 對結果進行排序的方式完全相同。為此,您想要建立一個 預存程序將該語句保存在可重複使用的名為 procedure.
要建立此預存程序,請執行下列程式碼片段:
CREATE DATABASEprocedures;
如上一節所述,第一個和最後一個指令(DELIMITER // 和 DELIMITER ;)告訴 MySQL 在過程建立期間停止將分號字元視為語句分隔符號。
CREATE PROCEDURE SQL 指令後面接著過程名稱get_all_cars,您可以定義它以最好地描述過程的作用。過程名稱後面有一對括號() 您可以在其中新增參數。在此範例中,該過程不 使用參數,因此括號為空。然後,在定義流程程式碼區塊的開始和結束的 BEGIN 和 END 指令之間,逐字寫入先前使用的 SELECT 語句。
資料庫將傳回一條成功訊息:
ssh sammy@your_server_ip
get_all_cars過程現在保存在資料庫中,當呼叫時,它將執行保存的語句: is.
要執行已儲存的預存程序,可以使用CALL SQL 指令,後面接著過程名稱。嘗試像這樣運行新創建的過程:
mysql -u sammy-p
過程名稱get_all_cars就是使用該過程所需的全部內容。您不再需要手動鍵入先前使用的 SELECT 語句的任何部分。資料庫將顯示結果,就像之前運行的SELECT 語句的輸出一樣:
CREATE DATABASEprocedures;
您現在已成功建立一個不帶任何參數的儲存過程,該儲存過程會傳回cars 表中以特定方式訂購的所有汽車。您可以在多個應用程式中使用該過程。
在下一節中,您將建立一個接受 根據使用者輸入更改過程行為的參數。
以上是如何在 MySQL 中使用預存程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!