无法识别雪花存储过程参数

时间:2020-12-21 14:51:17

标签: snowflake-cloud-data-platform

我正在构建一个雪花存储过程,但在雪花过程中使用传递的参数时遇到了困难。

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 中讨论过的插值方法,但也没有成功。

有关如何处理传递参数的任何线索。

1 个答案:

答案 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.');