您如何在雪花过程中参数化限制和偏移量?

How do you parameterize Limit and Offset in a Snowflake Procedure?

如何在 Snowflake Procedure 中参数化 Limit 和 Offset?像这样调用此过程时: CALL GETJOBS ('test1', 3, 3);

响应是:“失败:SQL 编译错误:\nlimit 子句中的无效行数‘:2’”

它似乎不接受限制和偏移参数。

CREATE OR REPLACE PROCEDURE "GETJOBS"("CODES" VARCHAR(16777216), "LIMIT" FLOAT, "OFFSET" FLOAT)
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS '
        var sql = snowflake.createStatement({ 
                    sqlText: `select jobnbr 
                              from jobs
                              where islocked = 1                            
                              order by jobnbr 
                              limit :2 offset :3;`,
                    binds: [CODES, LIMIT, OFFSET].map(function(x){return x === undefined ? null : x})                   
        });

        try {
            var results = sql.execute();            
            var columns = sql.getColumnCount();         
            var array = [];         
            while (results.next()) {
                let object = new Object;                
                var current = 1;
                while (current <= columns) {
                    object[results.getColumnName(current).toString()] = results.getColumnValue(current);
                    current++;
                }
                array.push(object);             
            }
            return array;
        }
        catch (err) {           
            return "Failed: " + err;
        }       
        return null;
    ';

您的解决方案可以是更改以下内容:

var sql = snowflake.createStatement({ 
                    sqlText: `select jobnbr 
                              from jobs
                              where islocked = 1                            
                              order by jobnbr 
                              limit :2 offset :3;`,
                    binds: [CODES, LIMIT, OFFSET].map(function(x){return x === undefined ? null : x})                   
        });

类似于:

var sql_cmd = "select jobnbr from jobs where islocked = 1 order by jobnbr limit " + LIMIT + " offset " + OFFSET;
var sql = snowflake.createStatement({ 
                    sqlText: sql_cmd,
                    binds: [CODES].map(function(x){return x === undefined ? null : x})                   
        });

但这不会使用 LIMIT 和 OFFSET 的绑定。它在调用存储过程时仍然有效:

CALL GETJOBS ('test1', 3, 3);

使用 QUALIFYROW_NUMBER 的替代方法:

var sql = snowflake.createStatement({ 
            sqlText: `select jobnbr 
                      from jobs
                      where islocked = :1
                      qualify row_number() over(order by jobnbr) between :2 and :3                           
                              order by jobnbr`,
            binds: [CODES, OFFSET + 1, LIMIT + OFFSET + 1].map(function(x){return x === undefined ? null : x})                   
        });