2025年1月15日 星期三

利用JavaScript撰寫MySQL Stored Program (文/恆逸資深講師 吳修福)



隨著JavaScript愈來愈普及,從網站前端的互動功能到後端服務的開發工作,可以使用的地方也愈來愈多。


MySQL自9.0企業版開始也可以使用JavaScript來進行預存程式的開發,這樣有什麼好處呢?從SQL語言來看的話,其主要功能是針對資料的操作而設計的,所以其結構會跟其他程式語言有一定程度上的差別,例如以下是建立一個帶有初始值的變數:

SQL:
DECLARE mystr VARCHAR(5) DEFAULT 'hello';
    
Java:
String mystr = "hello";
    
JavaScript:
let mystr = "hello"    

如果本來就是對於SQL語法很熟悉的開發人員,這樣結構不會造成開發上的障礙;但是對於很少或是剛開始接觸的人來說,就必須經歷一段學習過程來熟悉SQL語法。 所以如果可以使用本來就熟悉的語言結構來進行預存程式的開發工作,那麼應該可以增加不少的開發效率。


要開始利用JavaScript撰寫預存程式之前,我們必須先完成一個工作,由於伺服器並不認得JavaScript語言,所以要先安裝Multilingual Engine Component (MLE) 來達成這個目的,它的URN是file://component_mle:

INSTALL COMPONENT 'file://component_mle'   

如果沒有先安裝好的話會在執行以JavaScript建立的預存程式時引發錯誤:

root [demo]> select add_nos(3, 6);
ERROR 6001 (HY000): Language component: Not available.      

完成了MLE的安裝之後先寫一個簡單的預存函數來說明利用JavaScript進行開發時與一般函數的不同之處。

傳統SQL:

root [demo]> DELIMITER //
root [demo]> CREATE FUNCTION sql_add(arg1 INT, arg2 INT)
    -> RETURNS INT
    -> BEGIN
    ->     RETURN arg1 + arg2;
    -> END//
Query OK, 0 rows affected (0.00 sec)
root [demo]> DELIMITER ;          

JavaScript:

root [demo]> CREATE FUNCTION js_add(arg1 INT, arg2 INT)
    -> RETURNS INT LANGUAGE JAVASCRIPT AS
    -> $mle$
    $>     return arg1 + arg2;
    $> $mle$
    -> ;
Query OK, 0 rows affected (0.00 sec)          

執行:

root [demo]> SELECT js_add(5, 8), sql_add(5, 8);
+--------------+---------------+
| js_add(5, 8) | sql_add(5, 8) |
+--------------+---------------+
|           13  |            13  |
+--------------+---------------+
1 row in set (0.00 sec)           

以下是幾個不同的點:

  1. 用JavaScript時必須指定LANGUAGE子句明確指定使用JavaScript語言。
  2. 一般函數本體有多個敘述時需放在BEGIN…END之間(本例其實可以省略,為說明而保留);JavaScript則接在AS子句後,並寫在一對「$$」(或 $mle$、$js$ 都可以)組成的本體範圍中,此時提示符號會改變。
  3. 一般寫完SQL敘述後需要一個terminator(一般是「;」)來執行,但是在寫預存程式是可能會有多個敘述,為了避免寫到一半就執行了,所以需要用DELIMITER敘述來將terminator先換掉,等到寫完之後再換回來;而JavaScript每個敘述後的分號可以加或省略,並不影響程式的執行,且撰寫函數本體時由MLE接手,也不會有突然執行的問題,所以不需要先將terminator換掉。

光是這幾個點就可以讓JavaScript預存程式的開發變得容易許多。對於已經會JavaScript語言或打算開始學習的人來說,也讓JavaScript多一個可以被使用的地方。

您可在下列課程中了解更多技巧喔!

0 意見:

張貼留言