MySQL Shell 9.0  /  MySQL Shell 程式碼執行  /  互動式程式碼執行

5.2 互動式程式碼執行

MySQL Shell 的預設模式提供在命令提示字元輸入時,互動式執行資料庫操作的功能。這些操作可以使用 JavaScript、Python 或 SQL 撰寫,取決於目前的第 5.1 節,「使用中的語言」。執行後,操作的結果會顯示在螢幕上。

與任何其他語言直譯器一樣,MySQL Shell 對於語法非常嚴格。例如,以下 JavaScript 程式碼片段會開啟到 MySQL 伺服器的連線,然後讀取並列印集合中的文件

var mySession = mysqlx.getSession('user:pwd@localhost');
var result = mySession.getSchema('world_x').getCollection('countryinfo').find().execute();
var record = result.fetchOne();
while(record){
  print(record);
  record = result.fetchOne();
}

如上所示,對 find() 的呼叫之後接著 execute() 函數。只有在呼叫 execute() 時,CRUD 資料庫命令才會實際在 MySQL 伺服器上執行。但是,當以互動方式使用 MySQL Shell 時,只要在陳述式上按下 Return 鍵,就會隱含地呼叫 execute()。然後會擷取操作的結果並顯示在螢幕上。以下是何時需要呼叫 execute() 的規則

  • 以這種方式使用 MySQL Shell 時,在下列情況下,呼叫 execute() 會變成選擇性的

    • Collection.add()

    • Collection.find()

    • Collection.remove()

    • Collection.modify()

    • Table.insert()

    • Table.select()

    • Table.delete()

    • Table.update()

  • 如果將物件指定給變數,則會停用自動執行。在這種情況下,必須呼叫 execute() 才能執行操作。

  • 當處理一行且函數傳回任何可用的 Result 物件時,Result 物件中包含的資訊會自動顯示在螢幕上。傳回 Result 物件的函數包括

    • SQL 執行和 CRUD 操作 (如上所列)

    • mysqlmysqlx 模組中,工作階段物件的交易處理和 drop 函數:-

      • startTransaction()

      • commit()

      • rollback()

      • dropSchema()

      • dropCollection()

      • ClassicSession.runSql()

根據上述規則,在互動模式中,在 MySQL Shell 中建立工作階段、查詢及列印集合中的文件所需的陳述式如下

mysql-js> var mySession = mysqlx.getSession('user:pwd@localhost');
mysql-js> mySession.getSchema('world_x').getCollection('countryinfo').find();

不需要呼叫 execute(),而且會自動列印 Result 物件。

多行支援

可以指定跨越多行的陳述式。在 Python 或 JavaScript 模式下,當陳述式區塊開始時 (例如在函數定義、if/then 陳述式、for 迴圈等等),會自動啟用多行模式。在 SQL 模式下,當發出 \ 命令時,會開始多行模式。

一旦開始多行模式,後續輸入的陳述式會被快取。

例如

mysql-sql> \
... create procedure get_actors()
... begin
...   select first_name from sakila.actor;
... end
...
注意

當您使用 \sql 命令搭配查詢來執行單一 SQL 陳述式時 (當另一個語言處於使用中狀態時),您無法使用多行模式。該命令只接受單一行上的單一 SQL 查詢。