雪花存储过程变量绑定错误

Posted

技术标签:

【中文标题】雪花存储过程变量绑定错误【英文标题】:Snowflake stored procedure variable binding error 【发布时间】:2020-02-23 19:02:01 【问题描述】:

我正在尝试创建和执行一个简单的 Snowflake 存储过程,它接受一个输入参数并创建一个阶段。但是,当我尝试调用它抛出的过程时 错误:参数的无效值 [:]

create or replace procedure raw.test.create_stage_test(PARM_URL string)
    returns string
    language javascript
    execute as owner
    as
    $$
    var cmd = `create or replace stage raw.test.agency_type_test
               url =:1
               file_format = (type = json)
               credentials = (aws_role = 'arn:aws:iam::myrole');`
               
    var sql_statement = snowflake.createStatement(
     sqlText: cmd,
     binds: [PARM_URL]
     );
    
    try 
    var rs = sql_statement.execute();
     rs.next()
     rcount = rs.getColumnValue(1);
       if (rcount == 0)
        throw "row count is 0";
       
     return "Rows count: " + rcount;
    
    catch (err)  
        return "Failed: " + err;   // Return a success/error indicator.
        
    $$;


CALL raw.test.create_stage_test('s3://mybucket');

【问题讨论】:

好像是个bug 【参考方案1】:

也许使用插值,如以下代码 sn-p 所示,可能是另一种选择?注意 url 值周围的单引号:

var cmd = `create or replace stage agency_type_test
           url='$PARM_URL'
           file_format = (type = json)
           credentials = (aws_role = 'arn:aws:iam::myrole');`

var sql_statement = snowflake.createStatement(
 sqlText: cmd
 );

【讨论】:

请小心,因为字符串插值打开了 SQL 注入攻击的大门。如果这是一个问题,那么一定要清理 args。 这已经奏效了!正是我想要的。请阐明对 args 进行消毒的一些信息?任何例子都会有所帮助。 当然,例如,您可以使用正则表达式来确保 PARM_URL 的格式类似于有效的 S3 URL,并且不包含空格、引号、分号或双点。

以上是关于雪花存储过程变量绑定错误的主要内容,如果未能解决你的问题,请参考以下文章

带有输入变量的雪花存储过程

如何使用雪花存储过程将变量数据传递到雪花表中

雪花上的 SQL 存储过程将绑定列视为字符串,并且它没有从表中获取其值

Python Glue 作业 - 雪花存储过程未返回确切的错误消息

当我尝试使用雪花存储过程执行更改命令时给出错误?

雪花存储过程给出类似“Uncaught ReferenceError”之类的错误?