PREPARE stmt_name FROM preparable_stmt
PREPARE
陳述式會準備一個 SQL 陳述式,並將其指定一個名稱,stmt_name
,以便稍後參考該陳述式。預備陳述式會使用 EXECUTE
執行,並使用 DEALLOCATE PREPARE
釋放。如需範例,請參閱 第 15.5 節「預備陳述式」。
陳述式名稱不區分大小寫。preparable_stmt
可以是字串常值或使用者變數,其中包含 SQL 陳述式的文字。該文字必須表示單一陳述式,而不是多個陳述式。在陳述式中,可以使用 ?
字元作為參數標記,以指示稍後在您執行查詢時,要將資料值繫結至查詢的位置。?
字元不應放在引號內,即使您打算將它們繫結至字串值也是如此。參數標記只能用於應出現資料值的位置,而不能用於 SQL 關鍵字、識別碼等等。
如果已存在具有給定名稱的預備陳述式,則會在準備新陳述式之前隱含地取消配置該陳述式。這表示如果新陳述式包含錯誤且無法準備,則會傳回錯誤,且不存在具有給定名稱的陳述式。
預備陳述式的範圍是建立它的工作階段,這有幾個含義:
在一個工作階段中建立的預備陳述式,其他工作階段無法使用。
當工作階段結束時,無論是正常還是異常結束,其預備陳述式都不再存在。如果啟用自動重新連線,則不會通知用戶端連線已遺失。因此,用戶端可能希望停用自動重新連線。請參閱自動重新連線控制。
在儲存程式中建立的預備陳述式會在程式執行完成後繼續存在,並且稍後可以在程式外執行。
在儲存程式內容中準備的陳述式無法參考儲存程序或函數參數或區域變數,因為它們會在程式結束時超出範圍,並且如果稍後在程式外執行陳述式,則將無法使用。作為一種解決方法,請改為參考使用者定義的變數,這些變數也具有工作階段範圍;請參閱第 11.4 節「使用者定義的變數」。
預備陳述式中使用的參數類型是在首次準備陳述式時決定的;當對此預備陳述式呼叫 EXECUTE
時,它會保留此類型(除非重新準備陳述式,如此章節稍後說明)。以下列出決定參數類型的規則:
作為二元算術運算子運算元的參數,具有與另一個運算元相同的資料類型。
如果二元算術運算子的兩個運算元都是參數,則參數的類型由運算子的內容決定。
如果參數是一元算術運算子的運算元,則參數的類型由運算子的內容決定。
如果算術運算子沒有類型決定內容,則所涉及任何參數的衍生類型是
DOUBLE PRECISION
。例如,當參數是SELECT
清單中的最上層節點,或當它是比較運算子的一部分時,可能會發生這種情況。作為字元字串運算子運算元的參數,具有與其他運算元的彙總類型相同的衍生類型。如果運算子的所有運算元都是參數,則衍生類型為
VARCHAR
;其定序由collation_connection
的值決定。作為時間運算子運算元的參數,如果運算子傳回
DATETIME
,則具有DATETIME
類型;如果運算子傳回TIME
,則具有TIME
類型;如果運算子傳回DATE
,則具有DATE
類型。作為二元比較運算子運算元的參數,具有與比較的另一個運算元相同的衍生類型。
作為三元比較運算子 (例如
BETWEEN
) 運算元的參數,具有與其他運算元的彙總類型相同的衍生類型。如果比較運算子的所有運算元都是參數,則它們的每個衍生類型都是
VARCHAR
,其定序由collation_connection
的值決定。作為任何
CASE
、COALESCE
、IF
、IFNULL
或NULLIF
輸出運算元的參數,具有與運算子的其他輸出運算元的彙總類型相同的衍生類型。如果任何
CASE
、COALESCE
、IF
、IFNULL
或NULLIF
的所有輸出運算元都是參數,或者它們全部為NULL
,則參數的類型由運算子的內容決定。如果參數是任何
CASE
、COALESCE()
、IF
或IFNULL
的運算元,且沒有類型決定內容,則所涉及的每個參數的衍生類型為VARCHAR
,其定序由collation_connection
的值決定。作為
CAST()
運算元的參數,具有CAST()
所指定的相同類型。如果參數是
SELECT
清單的直接成員,而不是INSERT
陳述式的一部分,則參數的衍生類型為VARCHAR
,其定序由collation_connection
的值決定。如果參數是
SELECT
清單的直接成員,而該清單是INSERT
陳述式的一部分,則參數的衍生類型是參數插入的對應欄位的類型。如果參數用作
UPDATE
陳述式的SET
子句或INSERT
陳述式的ON DUPLICATE KEY UPDATE
子句中的指派來源,則參數的衍生類型是由SET
或ON DUPLICATE KEY UPDATE
子句更新的對應欄位的類型。如果參數是函數的引數,則衍生類型取決於函數的傳回類型。
對於實際類型和衍生類型的某些組合,會觸發陳述式的自動重新準備,以確保與先前版本的 MySQL 更緊密地相容。如果符合以下任何條件,則不會發生重新準備:
對於除了剛才列出的情況之外的案例,會重新準備語句,並使用實際的參數型別,而不是衍生的參數型別。
這些規則也適用於預備語句中引用的使用者變數。
在預備語句的第一次執行之後,對於後續的語句執行,若針對指定的參數或使用者變數使用不同的資料型別,將會導致語句重新準備。這效率較低;也可能導致參數(或變數)的實際型別發生變化,進而使預備語句的後續執行產生不一致的結果。基於這些原因,建議在重新執行預備語句時,針對給定的參數使用相同的資料型別。