函数 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
。这包括结果集中列的名称。如果结果集不为空,则会按获取顺序打印每行的内容;否则,该函数会获取受语句影响的行数和最后插入 ID 的值。最后,它使用 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)
本节介绍在使用 SQL API 时,MySQL JavaScript 存储程序中的基本错误处理。
在语句准备或执行期间遇到的 SQL 错误将在 JavaScript 中作为异常抛出,这些异常可以使用一个或多个 try ... catch
块进行处理,在这种情况下,执行将继续进行。如果错误未以这种方式处理,存储过程执行将停止并产生在 JavaScript 内部执行 SQL 查询期间遇到的原始 SQL 错误。
执行 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
您可以选择在 JavaScript 中处理 SQL 错误,使用 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)