MySQL Shell 8.4  /  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() 函式。CRUD 資料庫命令僅在呼叫 execute() 時才實際在 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 模組中工作階段物件的交易處理和卸除函式:-

      • 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 查詢。