带有 IF 语句空值检查的存储过程雪花

Stored Procedure Snowflake with IF statement Null Check

我编辑了之前的代码以使其更简单。低于 returns 对我来说总是 SELECT 2. 我希望得到它 SELECT 1 因为 etlId 是 0.

问题可能出在哪里?

谢谢

此致

'
function getScalarValue(queryString) {
    var out;
    cmd = {sqlText: "set etl_id = 0 "};
    stmt = snowflake.createStatement(cmd);
    var rs;
    rs = stmt.execute();
    rs.next();
    return rs.getColumnValue(1);
    return out;
}
  var etlId = getScalarValue("select $etl_id");
        if (etlId == 0 )  
                {
                    var sql_command = "SELECT 1";
                }
        else {
                    var sql_command = "SELECT 2";
                  }
            try {
            snowflake.execute (
                {sqlText: sql_command}
                );
            return "Success" ;   // Return a success/error indicator.
            }
        catch (err)  {
            return "Failed: " + err;   // Return a success/error indicator.
            }                   
'

$etl_id 不是 JavaScript 变量。它是一个 SQL 变量。您可以使用辅助函数从 SQL 语句中获取标量值。此辅助函数获取第一列、第一行值和 returns it:

更新:根据你的更新,应该是这样的:

create or replace procedure TEST()
returns string
language javascript
execute as caller
as
$$

  var etlId = getScalarValue("select $etl_id");
        if (etlId == 0 )  
                {
                    var sql_command = "SELECT 1";
                }
        else {
                    var sql_command = "SELECT 2";
                  }
            try {
            snowflake.execute (
                {sqlText: sql_command}
                );
            return "Success" ;   // Return a success/error indicator.
            }
        catch (err)  {
            return "Failed: " + err;   // Return a success/error indicator.
            }  
            
function getScalarValue(queryString) {
    var out;
    cmd = {sqlText: queryString};
    stmt = snowflake.createStatement(cmd);
    var rs;
    rs = stmt.execute();
    rs.next();
    return rs.getColumnValue(1);
    return out;
}

$$;

set etl_id = 1;
call test();

感谢您的回复。我有另一种解决方案,可以在脚本中使用变量作为参数。当我调用该过程时,我可以使用 SQL 来定义参数,所以这对我有用。再次感谢您的帮助。

此致

       create or replace procedure TEST(etlId, float)
        returns string
        language javascript
        execute as caller
        as
        $$
                if (etlId == 0 )  
                        {
                            var sql_command = "SELECT 1";
                        }
                else {
                            var sql_command = "SELECT 2";
                          }
                    try {
                    snowflake.execute (
                        {sqlText: sql_command}
                        );
                    return "Success" ;   // Return a success/error indicator.
                    }
                catch (err)  {
                    return "Failed: " + err;   // Return a success/error indicator.
                    }  
      $$
    
call TEST (select count(etl_id) etlId from view where etl_id not in (select etl_id from table))