简体   繁体   English

合并语句和存储过程

[英]Merge statement and stored procedure

I am trying to write a stored procedure with a Merge statement.我正在尝试使用Merge语句编写存储过程。 It looks something like this:它看起来像这样:

create or replace procedure database.events.insert_groupss()
returns string
LANGUAGE JAVASCRIPT
as
$$
var sql_cmd = 'Merge into database.events.groups et using
        (select lower(f.VALUE:id::string) as id,
                min(f.VALUE:time_timestamp::timestamp) as event_timestamp,
                f.VALUE:service_string::string as service,
                f.VALUE:title_string::string as title,
                min(X.VALUE:created_at::timestamp) as title_ts ,
                X.VALUE:group::string as group
         from \'@database.sources.s3stage/version=3/stream=live/year=2019/month=12/\'
         (file_format => \'oak.public.JSON_FORMAT\' ), lateral flatten (input => $1:group_events, RECURSIVE => TRUE) f
         , LATERAL FLATTEN(parse_json(replace(replace(replace(replace(f.value:groups ,\'"[\', \'[\'),\'=>\',\':\'),\'\\\\\',\'\'),\']"\',\']\'))) x
          where id is not null and group is not null
          group by id,group,service,title)a
         on et.id=a.id and et.group = a.group
         when not matched then Insert (id , event_timestamp , service , title , title_ts ,group  )
                               values (a.id , a.event_timestamp , a.service , a.title , a.title_ts ,a.group  );';
try {

    snowflake.execute ({sqlText: sql_cmd});

    return "Succeeded";

    }

catch (err) {

    return "Failed: " + err;  // Return a success/error indicator.

    }
$$;

The stored procedure was created, but if I run it, I am getting some syntax error.存储过程已创建,但如果我运行它,我会收到一些语法错误。 The escaping characters were escaped and the query was getting executed when I run it manually (with using the stored procedure).转义字符被转义,查询在我手动运行时被执行(使用存储过程)。

Here is the error I am getting这是我得到的错误

JavaScript compilation error: Uncaught SyntaxError: Invalid or unexpected token in INSERT_GROUPS at 'var sql_cmd = 'Merge into database.events.groups et using' position 14 JavaScript 编译错误:未捕获的 SyntaxError:INSERT_GROUPS 中的无效或意外标记位于 'var sql_cmd = 'Merge into database.events.groups et using' 位置 14

The problem is sql_cmd is in muti line so you need to concatenate or it should be in single line.问题是 sql_cmd 在多行中,因此您需要连接或应该在单行中。

create or replace procedure  database.events.insert_groupss()
returns string
LANGUAGE JAVASCRIPT
as
$$
var sql_cmd  = 'Merge into database.events.groups et using'
    sql_cmd += ' (select lower(f.VALUE:id::string) as id,'
    sql_cmd += ' min(f.VALUE:time_timestamp::timestamp) as event_timestamp,'
    sql_cmd += ' f.VALUE:service_string::string as service,'
    sql_cmd += ' f.VALUE:title_string::string as title,'
    sql_cmd += ' min(X.VALUE:created_at::timestamp) as title_ts ,'
    sql_cmd += ' X.VALUE:group::string as group'
    sql_cmd += ' from \'@database.sources.s3stage/version=3/stream=live/year=2019/month=12/\''
    sql_cmd += ' (file_format => \'oak.public.JSON_FORMAT\' ), lateral flatten (input => $1:group_events, RECURSIVE => TRUE) f'
    sql_cmd += ' , LATERAL FLATTEN(parse_json(replace(replace(replace(replace(f.value:groups ,\'"[\', \'[\'),\'=>\',\':\'),\'\\\\\',\'\'),\']"\',\']\'))) x'
    sql_cmd += ' where id is not null and group is not null'
    sql_cmd += ' group by id,group,service,title)a'
    sql_cmd += ' on et.id=a.id and et.group = a.group'
    sql_cmd += ' when not matched then Insert (id , event_timestamp , service , title , title_ts ,group  )'
    sql_cmd += ' values (a.id , a.event_timestamp , a.service , a.title , a.title_ts ,a.group  );";'
try {

    snowflake.execute ({sqlText: sql_cmd});

    return "Succeeded";

    }

catch (err) {

    return "Failed: " + err;  // Return a success/error indicator.

    }
$$;

Issue is in try clause , incorrect SQL variable name.问题出在 try 子句中,SQL 变量名称不正确。 Replace with below替换为下面

snowflake.execute ({sqlText: sql_cmd})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM