Spec-Zone.ru › MySQL 9.2

27.3.7.3 Работа с данными и метаданными

Наборы результатов

Функция print_result(), показанная здесь, принимает на вход набор результатов (SqlResult):

function print_result(result) {
  if (result.hasData()) {
    console.log(result.getColumnNames())
    console.log(result.getColumns())

    let row = result.fetchOne()

    while(row) {
      console.log(row.toArray())
      row = result.fetchOne()
    }
  }
  else {
    console.log("Number of affected rows: " + result.getAffectedItemsCount())
    console.log("Last insert ID: " + result.getAutoIncrementValue())
  }

  while(result.nextResult()) {
    console.log("\nNext result set")
    print_result(result)
  }
}

Если query — это текст допустимого SQL-запроса, функцию можно вызвать так в теле хранимой JavaScript-процедуры:

let stmt = session.sql(query);
let res = stmt.execute();

print_result(res);

print_result() выводит свой вывод в stdout. Это включает имена столбцов в наборе результатов. Если набор результатов не пуст, содержимое каждой строки выводится в полученном порядке; в противном случае функция получает количество строк, затронутых оператором, и значение последнего вставленного идентификатора. Наконец, она проверяет наличие нескольких наборов результатов с помощью nextResult() и вызывает себя для следующего набора результатов, если таковой имеется.

Метаданные

В этом разделе показано, как получить метаданные столбцов.

CREATE PROCEDURE jssp_simple_meta(IN query VARCHAR(250))
LANGUAGE JAVASCRIPT AS $$

  let stmt = session.sql(query)
  let result = stmt.execute()

  console.log(result.getColumnNames())

  let cols = result.getColumns()
  let cnt = result.getColumnCount()

  var out = 'COLUMN INFO:'

  for (var i=0; i<cnt; i++) {
    let col = cols[i]

    out += "\nColumn: " + col.getColumnName() + "(" + col.getColumnLabel() + ")"
    out += "; Schema: " + col.getSchemaName()
    out += "; Table: " + col.getTableName() + "(" + col.getTableLabel() + ")"
    out += "; Type: " + col.getType();
  }

  out += "\n"

  console.log(out);

  if (result.hasData()) {
    console.log("ROWS:")
    let row = result.fetchOne()

    while(row) {
      console.log(row.toArray())
      row = result.fetchOne()
    }
  }

$$;

Вывод:

mysql> SELECT mle_session_reset();
+------------------------------------------+
| mle_session_reset()                      |
+------------------------------------------+
| The session state is successfully reset. |
+------------------------------------------+
1 row in set (0.01 sec)

mysql> CALL jssp_simple_meta("
    ">   SELECT c.Name, c.LocalName, t.Name AS Capital, c.Population
    ">   FROM country c
    ">   JOIN countrylanguage l
    ">   ON c.Code=l.CountryCode
    ">   JOIN city t
    ">   ON c.Capital=t.ID
    ">   WHERE l.Language='Swedish'
    "> ");
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT mle_session_state('stdout')\G
*************************** 1. row ***************************
mle_session_state('stdout'): Name,LocalName,Capital,Population
COLUMN INFO:
Column: Name(Name); Schema: world; Table: country(c); Type: STRING
Column: LocalName(LocalName); Schema: world; Table: country(c); Type: STRING
Column: Name(Capital); Schema: world; Table: city(t); Type: STRING
Column: Population(Population); Schema: world; Table: country(c); Type: INT

ROWS:
Denmark,Danmark,København,5330000
Finland,Suomi,Helsinki [Helsingfors],5171300
Norway,Norge,Oslo,4478500
Sweden,Sverige,Stockholm,8861400

1 row in set (0.00 sec)
Обработка ошибок

В этом разделе описывается базовая обработка ошибок в хранимых MySQL-JavaScript-программах при использовании SQL-API.

SQL-ошибки, возникающие во время подготовки или выполнения оператора, выбрасываются в JavaScript как исключения, где их можно обработать с использованием одного или нескольких блоков try ... catch, в этом случае выполнение продолжается. Если ошибка не обрабатывается таким образом, выполнение хранимой процедуры прекращается, и генерируется исходная SQL-ошибка, которая возникла во время выполнения SQL-запроса внутри JavaScript.

Выполнение SHOW WARNINGS после выполнения JavaScript-хранимой процедуры возвращает ошибки или предупреждения, сгенерированные последним выполненным оператором внутри процедуры.

Некоторые ошибки нельзя обработать в JavaScript. Например, если запрос прерван (CTRL-C), выполнение хранимой программы останавливается немедленно и генерируется ошибка. Аналогично, ошибки из-за недостатка памяти нельзя обработать в JavaScript-процедурах.

SQL-оператор, вызывающий ошибки, которые не обрабатываются в хранимой программе, возвращает их клиенту. Для наблюдения за этим мы создаем хранимую процедуру с помощью следующего SQL-запроса:

CREATE PROCEDURE jssp_simple_error(IN query VARCHAR(250))
LANGUAGE JAVASCRIPT AS $$
 let session = mysql.getSession()
 var result1 = session.sql("SELECT * FROM t_unknown;").execute()
$$;

Теперь мы вызываем jssp_simple_error(), передавая ему запрос к таблице, существование которой нам неизвестно, так:

mysql> CALL jssp_simple_error("SELECT * FROM bogus");
ERROR 1146 (42S02): Table 'test.t_unknown' doesn't exist

Можно обрабатывать SQL-ошибки в JavaScript, используя синтаксис try-catch, например так:

CREATE PROCEDURE jssp_catch_errors(IN query VARCHAR(200))
LANGUAGE JAVASCRIPT AS $$
 try {
  var result = session.sql("SELECT * FROM bogus").execute()
 } catch (e) {
  console.error("\nJS Error:\n" + e.name + ":\n" + e.message)
 }
$$;

Здесь вы можете увидеть результат, когда запрос, переданный jssp_catch_errors(), пытается получить доступ к несуществующей таблице:

mysql> CALL jssp_catch_errors("SELECT * FROM bogus");
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT mle_session_state('stderr')\G
*************************** 1. row ***************************
mle_session_state('stderr'):
JS Error:
org.graalvm.polyglot.nativeapi.PolyglotNativeAPI$CallbackException:
SQL-CALLOUT: Error code: 1146 Error state: 42S02 Error message: Table 'test.bogus' doesn't exist

1 row in set (0.00 sec)

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/srjs-api-data-metadata.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API