文件首頁
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 參考手冊  /  ...  /  JavaScript 儲存程式的建立與管理

27.3.1 JavaScript 儲存程式的建立與管理

以 JavaScript 編寫的儲存函數或儲存程序,其建立、叫用和維護方式與以 SQL 編寫的程式大致相同,但須遵守此處列出的差異

  • 必須在用於建立儲存程式的 CREATE FUNCTIONCREATE PROCEDURE 陳述式中,使用 LANGUAGE JAVASCRIPT 明確宣告儲存程式語言;否則,MySQL 會假設預期語言為 SQL。

    常式主體的語法會在建立時檢查;任何錯誤都會導致 CREATE 陳述式被拒絕,且不會建立儲存程式。

  • 程式主體必須使用 AS 關鍵字加上以錢字符號引用的分隔符號 (例如 $$$js$$mysql$ 等) 來標示。您必須使用相同的分隔符號來標示常式主體的開頭和結尾。可以使用引號來分隔常式主體,但建議使用以錢字符號引用的分隔符號,因為這樣可避免在函數或程序代碼中引用字串的問題。在第一個以錢字符號引用的分隔符號之後,mysql 用戶端提示字元會變更為 $>,以表示常式主體內的每個新行,直到遇到結尾的以錢字符號引用的分隔符號為止,之後提示字元會恢復為預設值 (通常為 ->)。這可以在先前用於建立 add_nos() 函數的 CREATE FUNCTION 陳述式中看到。

  • 對於 SQL 儲存常式,不需要指定陳述式分隔符號或終止符號。如果您使用選用的 ; 字元來分隔 JavaScript 陳述式,則會將其正確解譯為 JavaScript 常式的一部分,而不是 SQL 陳述式分隔符號,如下所示

    mysql> CREATE FUNCTION js_pow(arg1 INT, arg2 INT) 
        -> RETURNS INT LANGUAGE JAVASCRIPT 
        -> AS 
        ->   $$
        $>     let x = Math.pow(arg1, arg2);
        $>     return x;
        $>   $$
        -> ;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> SELECT js_pow(2,3);
    +-------------+
    | js_pow(2,3) |
    +-------------+
    |           8 |
    +-------------+
    1 row in set (0.00 sec)

    為了盡量減少可能的混淆,我們在本節剩餘的範例中,不會對任何 JavaScript 陳述式使用 ; 分隔符號。

  • 常式主體的文字一律會被視為 utfmb4,無論實際使用的字元集為何。這表示無論用戶端用於常式主體的字元集為何,伺服器都會先將其轉換為 utf8mb4,然後再將其儲存在資料字典中。由於 utf8mb4 包含所有其他支援的字元集,因此這應該不會是問題。

    與 SQL 儲存程式一樣,JavaScript 程式引數和常式名稱必須使用 utfmb3 字元集。請參閱 第 12.9 節,「Unicode 支援」

  • 字串引數和傳回類型預期為 utf8mb4;這表示如果 JavaScript 儲存程式所屬的結構描述的預設字元集為其他字元集,則其所有引數都必須明確宣告為 utf8mb4

    輸入引數名稱必須符合 JavaScript 識別碼的規則:它們可以包含 Unicode 字母、$_ 和數字 (0-9),但不得以數字開頭。

    使用 JavaScript 中保留的單字 (例如 varfunction) 作為引數名稱會產生錯誤。由於 MySQL JavaScript 儲存程式一律使用嚴格模式,因此也包括 packagelet 等關鍵字。如需完整清單,請參閱 保留字。此外,MLE 元件也保留了 mysqlconsolegraal 關鍵字,且不能在 MySQL JavaScript 儲存程式中用作變數或引數名稱。

  • 您可以使用 ALTER FUNCTIONALTER PROCEDURE 修改 JavaScript 儲存程式,就像您修改 SQL 儲存函數或程序一樣。不支援使用 ALTER 變更語言;在這種情況下,您必須使用 DROP FUNCTIONDROP PROCEDURE (視情況而定),然後使用適當的 CREATE 陳述式重新建立儲存程式。

若要取得伺服器上所有資料庫中所有 JavaScript 儲存程式的清單,請查詢 Information Schema ROUTINES 表格,如下所示

mysql> SELECT CONCAT(ROUTINE_SCHEMA, '.', ROUTINE_NAME) AS "JS Stored Routines" 
    ->   FROM INFORMATION_SCHEMA.ROUTINES 
    ->   WHERE EXTERNAL_LANGUAGE="JAVASCRIPT";
+------------------------+
| JS Stored Routines     |
+------------------------+
| test.pc1               |
| test.pc2               |
| world.jssp_simple1     |
| test.jssp_vsimple      |
| test.jssp_simple       |
| world.jssp_vsimple     |
| world.jssp_vsimple2    |
| world.jssp_simple_meta |
+------------------------+
8 rows in set (0.00 sec)