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
的值決定。如果參數是屬於
INSERT
陳述式一部分的SELECT
清單的直接成員,則參數的衍生類型是將參數插入其中的對應欄的類型。如果參數在
UPDATE
陳述式的SET
子句中,或在INSERT
陳述式的ON DUPLICATE KEY UPDATE
子句中用作指定來源,則參數的衍生類型是SET
或ON DUPLICATE KEY UPDATE
子句更新的對應欄的類型。如果參數是函數的引數,則衍生類型取決於函數的傳回類型。
對於實際類型和衍生類型的某些組合,會觸發陳述式的自動重新準備,以確保與先前版本的 MySQL 更接近的相容性。如果符合以下任何條件,則不會發生重新準備:
對於剛剛列出的情況以外的情況,會重新準備陳述式,並使用實際參數類型,而不是衍生參數類型。
這些規則也適用於預處理陳述式中參考的使用者變數。
對於首次執行之後的陳述式執行,在預處理陳述式內針對給定參數或使用者變數使用不同的資料類型,會導致重新準備陳述式。這樣效率較低;也可能導致參數(或變數)的實際類型發生變化,從而使結果與預處理陳述式的後續執行不一致。因此,建議在重新執行預處理陳述式時,針對給定參數使用相同的資料類型。