javascript - 在雪花的 javascript 过程中传递值
问题描述
在 Snowflake dwh 中是否可以检索 SQL 查询结果并将其作为变量传递给同一过程中的下一个查询?
我正在尝试尝试 %ROWCOUNT, CURSOR case 并陷入以下困境:
创建或替换过程 PASS_VAR_IN_JS() 返回 VARCHAR 语言 javascript 作为 $$ var command = "SELECT * FROM TABLE WHERE ATTRIBUTE = 'Value'"; var stmt = snowflake.createStatement( {sqlText: command} ); var result1 = stmt.execute(); 返回结果1.getColumnName(3); //这会返回列名 var col_name = result1.getColumnName(3); //将列名保存到变量中 //将列名传递给查询 var stmt = snowflake.createStatement({sqlText: "SELECT * FROM INFORMATION_SCHEMA WHERE COLUMN_NAME = ;", binds:[col_name]}); $$;
UPDATE - working code that passes one result to another query
<pre>
CREATE OR REPLACE PROCEDURE szpotma_rowcount()
RETURNS VARCHAR(250)
LANGUAGE JAVASCRIPT
as
$$
var command = `SELECT ATTR1 FROM TABLE1 LIMIT 1`;
var stmt = snowflake.createStatement( {sqlText: command} );
var rs = stmt.execute(), col_name ;
if (rs.next()) {
col_name = rs.getColumnValue(1);
stmt = snowflake.createStatement({
sqlText: `SELECT STATUS FROM TABLE_STATUS WHERE ATTR1 = :1`, binds: [col_name]});
//view second query results
rs = stmt.execute();
rs.next()
return rs.getColumnValue(1);
}
$$
解决方案
当然。
你可以这样做:
var command = `SELECT * FROM TABLE WHERE ATTRIBUTE = 'Value'`;
var stmt = snowflake.createStatement( {sqlText: command} );
var rs = stmt.execute(), col_name ;
if (rs.next()) {
col_name = rs.getColumnValue(3);
stmt = snowflake.createStatement({
sqlText: `SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = :1`,
binds: [col_name]
});
}
我列出了从结果集中提取数据的各种方法:
如何在存储过程中使用显示命令 - 不工作
[从上面复制]:
如果您有多个列,则代码会变得稍微复杂一些:
var result = [], row, col;
while (rs.next()) {
row = [];
for (col = 1; col <= stmt.columnCount; col++)
row.push(rs.getColumnValue(col));
result.push(row);
}
核心 JavaScript 程序员可能会将其压缩为:
var result = [], cols = Array.from({ length: stmt.columnCount }, (v, i) => i + 1);
while (rs.next()) result.push(cols.map(c => rs.getColumnValue(c)));
最后一个变体,其中第一个结果行包含列名,随后的行包含结果集中的数据,可通过 result[row][column] 访问:
var result =
[ Array.from({ length: stmt.columnCount }, (v, i) => stmt.getColumnName(i + 1)) ];
while (rs.next()) result.push(result[0].map(cn => rs.getColumnValue(cn)));
推荐阅读
- c# - 我在箱子里有一个开关。如何退出该开关并重复包含该开关的案例?
- python - 熊猫只删除连续重复的行,忽略特定的列
- ios - Swift Alamofire - 使用 NULL 值参数的 POST 请求
- c++11 - C++11 及更高版本:如何存储在模板化方法中接收的对象指针和方法指针以供以后使用?
- docker - 已解决 - docker push 到 nexus 注册表(代理后面)以 EOF 结尾
- python - 如何在 Django 中保存自定义用户类属性?
- c++ - MPI_Comm_Rank 的分段错误
- delphi - NotificationCenter Delphi,MacOS下的异常
- java - 跨度未使用 OpenTelemetry Java 导出到 Jaeger 收集器
- r - 多个变量的 Pivot_longer