我在snowflake中编写存储过程,其中我有几行具有多个连接的选择语句。所以我需要为每个数据库模式使用变量。我试着用下面的代码作为实验,但不能使它工作。谁能告诉我如何传递变量。
CREATE OR REPLACE PROCEDURE test_proc(tmpschema VARCHAR, dbschema VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
/* Load STARTED */
try{
snowflake.createStatement({sqlText:`TRUNCATE TABLE '${dbschema}'.TAB1`}).execute();
snowflake.createStatement({sqlText:`TRUNCATE TABLE '${tmpschema}'.TAB2`}).execute();
}
catch(err){
return 'Failed Truncating TMP tables: ' + err;
}
$$
;
使用上面的代码成功创建了过程,但是调用时抛出了一个错误。
call BIGDATA.test_proc('TMP', 'DB');
Error: Failed Truncating TMP tables:: ReferenceError: dbschema is not defined
在SQL和JS之间切换时,你必须注意变量的大写。
问题重现:
CREATE OR REPLACE PROCEDURE test_proc(x VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
`${x}`
$$
;
call test_proc('')
;
-- 100132 (P0000): JavaScript execution error: Uncaught ReferenceError: x is not defined in TEST_PROC at '`${x}`' position 0
这个修复了问题(X
):
CREATE OR REPLACE PROCEDURE test_proc(x VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
`${X}`
$$
这也修复了它("x"
):
CREATE OR REPLACE PROCEDURE test_proc("x" VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
`${x}`
$$