文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  PREPARE 陳述式

15.5.1 PREPARE 陳述式

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 的值決定。

  • 作為任何 CASECOALESCEIFIFNULLNULLIF 的輸出運算元的參數,與運算子其他輸出運算元的彙總類型具有相同的衍生類型。

  • 如果任何 CASECOALESCEIFIFNULLNULLIF 的所有輸出運算元都是參數,或者它們都是 NULL,則參數的類型由運算子的內容決定。

  • 如果參數是任何 CASECOALESCE()IFIFNULL 的運算元,且沒有類型決定內容,則涉及的每個參數的衍生類型都是 VARCHAR,其定序由 collation_connection 的值決定。

  • 作為 CAST() 的運算元的參數,其類型與 CAST() 所指定的類型相同。

  • 如果參數是 SELECT 清單的直接成員,且不是 INSERT 陳述式的一部分,則參數的衍生類型為 VARCHAR,其定序由 collation_connection 的值決定。

  • 如果參數是屬於 INSERT 陳述式一部分的 SELECT 清單的直接成員,則參數的衍生類型是將參數插入其中的對應欄的類型。

  • 如果參數在 UPDATE 陳述式的 SET 子句中,或在 INSERT 陳述式的 ON DUPLICATE KEY UPDATE 子句中用作指定來源,則參數的衍生類型是 SETON DUPLICATE KEY UPDATE 子句更新的對應欄的類型。

  • 如果參數是函數的引數,則衍生類型取決於函數的傳回類型。

對於實際類型和衍生類型的某些組合,會觸發陳述式的自動重新準備,以確保與先前版本的 MySQL 更接近的相容性。如果符合以下任何條件,則不會發生重新準備:

  • NULL 用作實際參數值。

  • 參數是 CAST() 的運算元。(而是會嘗試轉換為衍生類型,如果轉換失敗,則會引發例外狀況。)

  • 參數是字串。(在這種情況下,會執行隱含的 CAST(? AS derived_type)。)

  • 參數的衍生類型和實際類型都是 INTEGER,且具有相同的正負號。

  • 參數的衍生類型是 DECIMAL,而其實際類型是 DECIMALINTEGER

  • 衍生類型是 DOUBLE,而實際類型是任何數值類型。

  • 衍生類型和實際類型都是字串類型。

  • 如果衍生類型是時間類型,而實際類型也是時間類型。例外狀況:衍生類型是 TIME,而實際類型不是 TIME;衍生類型是 DATE,而實際類型不是 DATE

  • 衍生類型是時間類型,而實際類型是數值類型。

對於剛剛列出的情況以外的情況,會重新準備陳述式,並使用實際參數類型,而不是衍生參數類型。

這些規則也適用於預處理陳述式中參考的使用者變數。

對於首次執行之後的陳述式執行,在預處理陳述式內針對給定參數或使用者變數使用不同的資料類型,會導致重新準備陳述式。這樣效率較低;也可能導致參數(或變數)的實際類型發生變化,從而使結果與預處理陳述式的後續執行不一致。因此,建議在重新執行預處理陳述式時,針對給定參數使用相同的資料類型。