輸出參數是很少被使用的預存程序的功能。這很可惜,因為它們是將純量資料傳回給使用者的絕佳選擇。在今天的文章中,我們將學習輸出參數的一些用法以及如何在預存程序中使用它們。
語法
宣告參數的確切語法因不同資料庫供應商而有所不同,因此,我們可以看看幾個不同的範例。這是 SQL Server 的範例,它只是將輸入參數傳回給使用者:
而 MySQL 的語法略有不同,例如 IN 或 OUT 參數是位於參數名稱之前:
某些關聯式資料庫(RDBMS)(例如 MySQL)支援 INOUT 參數。這些是 IN 和 OUT 參數的組合,因為呼叫的程式會首先傳遞 INOUT 參數,然後預存程序在將更新的值傳送至呼叫的程式之前修改參數。其他 RDMBS(例如 SQL Server)視 OUT 參數為 INOUT,允許將其傳遞給程序。
一個稍微複雜的範例(MySQL)
Sakila 範例資料庫最初是作為 MySQL 學習工具而建立的,但此後也已移植到其他 DBMS。它以虛構的影片出租商店為主題,並包含許多使用者函式和預存程序。其中一些(例如film_in_stock 程序)同時包含 IN 和 OUT 參數。這是它在 Navicat Premium 中的定義:
film_in_stock 預存程序判斷特定商店中是否有特定電影的複本。這樣,它宣告了兩個輸入參數-電影 ID和商店 ID,以及轉送庫存中電影數量的輸出參數。一個使用者函式可能已被用於此目的,但是程序也可以列出庫存中每部電影的 ID。這就是為什麼程序主體中有兩句 SELECT 陳述式(在 BEGIN 和 END 分隔字元之間)的原因。第一句 SELECT 擷取電影 ID,而第二句 SELECT 使用找到的列數填入輸出參數。
執行 film_in_stock 預存程序
在 Navicat 中,我們可以按一下設計器中的「執行」按鈕直接執行一個程序。按一下它會彈出一個對話方塊,用於輸入輸入參數:
預存程序可能傳回多個結果集和/或輸出參數,因此要解決此問題,Navicat 會將每個結果集顯示在一個「結果」索引標籤中。第一個索引標籤顯示了該程序中第一個查詢產生的結果集,也就是庫存電影的庫存 ID:
第二個索引標籤顯示由 p_store_id 輸入參數來識別的商店中庫存影片數量(基本上是第一個查詢傳回的列數):
總結
在今天的文章中,我們看到了輸入或輸出參數和結果集的組合所提供的靈活性如何使預存程序成為資料庫開發人員手中真正強大的工具。