【问题标题】: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

标签: snowflake-cloud-data-platform


【解决方案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,并且不包含空格、引号、分号或双点。
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多