Snowflake JavaScript SP不支持官方文档中描述的所有方法
Snowflake JavaScript SP does not support all methods described in official documentation
我正在尝试在执行 INSERT INTO
语句的 Snowflake 中创建一个 JavaScript 存储过程。因此,我想接收已插入到目标中的行数 table。 Snowflake 文档描述我应该能够通过将方法 getNumRowsInserted()
应用于对象 Statement
来实现此目的。然而它似乎根本不起作用。
这是一个例子:
CREATE OR REPLACE TEMP TABLE my_little_test (x INT, y INT);
INSERT INTO my_little_test
SELECT 1,2;
CREATE OR REPLACE PROCEDURE merge_test_sp()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var result = {"num_rows":""};
var stmt = "INSERT INTO my_little_test SELECT 3, 4";
var exec_stmt = snowflake.createStatement({sqlText:stmt}).execute();
result["num_rows"] = exec_stmt.getNumRowsInserted();
return result;
$$
;
CALL merge_test_sp();
它抛出此错误消息:
JavaScript execution error: Uncaught TypeError: exec_stmt.getNumRowsInserted is not a function in MERGE_TEST_SP at 'result["num_rows"] = exec_stmt.getNumRowsInserted();' position 31 stackstrace: MERGE_TEST_SP line: 9
但是应用方法 getNumRowsAffected
有效:
CREATE OR REPLACE TEMP TABLE my_little_test (x INT, y INT);
INSERT INTO my_little_test
SELECT 1,2;
CREATE OR REPLACE PROCEDURE merge_test_sp()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var result = {"num_rows":""};
var stmt = "INSERT INTO my_little_test SELECT 3, 4";
var exec_stmt = snowflake.createStatement({sqlText:stmt}).execute();
// this method somehow works ?!
result["num_rows"] = exec_stmt.getNumRowsAffected();
return result;
$$
;
CALL merge_test_sp();
输出为{"num_rows": 1}
。
其他方法也不起作用,因为我用 MERGE INTO
语句尝试了同样的事情。 getNumDuplicateRowsUpdated
、getNumRowsDeleted
、getNumRowsUpdated
全部都不行。只有信息量较少的方法 getNumRowsAffected()
有效。
有没有人遇到过同样的问题?有人知道解决这个问题的方法吗?
顺便说一句:这是我所指文档的 link:https://docs.snowflake.com/en/sql-reference/stored-procedures-api.html#object-statement
谢谢和最诚挚的问候
你能试试这个吗?
CREATE OR REPLACE TEMP TABLE my_little_test (x INT, y INT);
INSERT INTO my_little_test
SELECT 1,2;
CREATE OR REPLACE PROCEDURE merge_test_sp()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var result = {"num_rows":""};
var stmt = "INSERT INTO my_little_test SELECT 3, 4";
var exec_stmt = snowflake.createStatement({sqlText:stmt});
exec_stmt.execute();
result["num_rows"] = exec_stmt.getNumRowsInserted();
return result;
$$
;
CALL merge_test_sp();
您通过 运行 snowflake.createStatement({sqlText:stmt}).execute() 将结果集分配给 exec_stmt,这就是它没有 getNumRowsInserted 方法的原因可用。
我正在尝试在执行 INSERT INTO
语句的 Snowflake 中创建一个 JavaScript 存储过程。因此,我想接收已插入到目标中的行数 table。 Snowflake 文档描述我应该能够通过将方法 getNumRowsInserted()
应用于对象 Statement
来实现此目的。然而它似乎根本不起作用。
这是一个例子:
CREATE OR REPLACE TEMP TABLE my_little_test (x INT, y INT);
INSERT INTO my_little_test
SELECT 1,2;
CREATE OR REPLACE PROCEDURE merge_test_sp()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var result = {"num_rows":""};
var stmt = "INSERT INTO my_little_test SELECT 3, 4";
var exec_stmt = snowflake.createStatement({sqlText:stmt}).execute();
result["num_rows"] = exec_stmt.getNumRowsInserted();
return result;
$$
;
CALL merge_test_sp();
它抛出此错误消息:
JavaScript execution error: Uncaught TypeError: exec_stmt.getNumRowsInserted is not a function in MERGE_TEST_SP at 'result["num_rows"] = exec_stmt.getNumRowsInserted();' position 31 stackstrace: MERGE_TEST_SP line: 9
但是应用方法 getNumRowsAffected
有效:
CREATE OR REPLACE TEMP TABLE my_little_test (x INT, y INT);
INSERT INTO my_little_test
SELECT 1,2;
CREATE OR REPLACE PROCEDURE merge_test_sp()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var result = {"num_rows":""};
var stmt = "INSERT INTO my_little_test SELECT 3, 4";
var exec_stmt = snowflake.createStatement({sqlText:stmt}).execute();
// this method somehow works ?!
result["num_rows"] = exec_stmt.getNumRowsAffected();
return result;
$$
;
CALL merge_test_sp();
输出为{"num_rows": 1}
。
其他方法也不起作用,因为我用 MERGE INTO
语句尝试了同样的事情。 getNumDuplicateRowsUpdated
、getNumRowsDeleted
、getNumRowsUpdated
全部都不行。只有信息量较少的方法 getNumRowsAffected()
有效。
有没有人遇到过同样的问题?有人知道解决这个问题的方法吗?
顺便说一句:这是我所指文档的 link:https://docs.snowflake.com/en/sql-reference/stored-procedures-api.html#object-statement
谢谢和最诚挚的问候
你能试试这个吗?
CREATE OR REPLACE TEMP TABLE my_little_test (x INT, y INT);
INSERT INTO my_little_test
SELECT 1,2;
CREATE OR REPLACE PROCEDURE merge_test_sp()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var result = {"num_rows":""};
var stmt = "INSERT INTO my_little_test SELECT 3, 4";
var exec_stmt = snowflake.createStatement({sqlText:stmt});
exec_stmt.execute();
result["num_rows"] = exec_stmt.getNumRowsInserted();
return result;
$$
;
CALL merge_test_sp();
您通过 运行 snowflake.createStatement({sqlText:stmt}).execute() 将结果集分配给 exec_stmt,这就是它没有 getNumRowsInserted 方法的原因可用。