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.