我正在构建一个雪花存储过程,但在雪花过程中使用传递的参数时遇到了困难。
create or replace procedure dumper(n float)
returns float
language javascript
execute as caller
as
$$
var text = "select file_name from table(information_schema.COPY_HISTORY(TABLE_NAME=> 'records', start_time=> dateadd(hours, ?, current_timestamp())));";
var statement = snowflake.createStatement({sqlText: text, binds: [n]});
var result = statement.execute();
return statement.getRowCount();
$$
;
试图调用上述过程
call dumper(-2);
导致以下错误
JavaScript execution error: Uncaught ReferenceError: n is not defined in DUMPER at ' var statement = snowflake.createStatement({sqlText: text, binds: [n]});' position 70 stackstrace: DUMPER line: 4
我尝试使用在 here 中讨论过的插值方法,但也没有成功。
有关如何处理传递参数的任何线索。
答案 0 :(得分:4)
您必须在 JavaScript 代码中将“N”大写:
var statement = snowflake.createStatement({sqlText: text, binds: [N]});
传递到 Snowflake 存储过程的变量的行为与其他对象名称一样,直到它们位于 JavaScript 中。如果它们不是双引号,则 Snowflake 隐式地将它们大写。请记住将传递到 Snowflake 中的 SP 和 UDF 的所有参数大写。使用 JavaScript 在 SP 或 UDF 中定义的变量遵循语言的正常规则。
由于常规规则适用于 Snowflake 标识符,就像它们适用于传递给过程和函数的变量一样,如果您想使用小写或混合大小写的变量名,您可以用双引号引起来:
create or replace function echo_string("n" string)
returns string
language javascript
as
$$
return n; // This works because "n" is double quoted in the signature
$$;
select echo_string('Hello world.');