您如何在雪花过程中参数化限制和偏移量?
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);
使用 QUALIFY
和 ROW_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})
});
如何在 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);
使用 QUALIFY
和 ROW_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})
});