Snowflake和存储过程如何在保存在内部阶段的文件行上循环



我有一个雪花阶段的文件,我想在每一行上循环,并将列值垂直插入到SAT表中。我启动了以下JavaScript存储过程:

CREATE PROCEDURE ADD_OBSERVATION_VALUES()
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$

// Get number of rows
var num_rows_sql = "SELECT COUNT(*) FROM @ingest_stg/load/(file_format => 'csv_format', pattern => '.*[.]csv.gz') t";
var stmt = snowflake.createStatement( {sqlText: num_rows_sql} );
var rows_result = stmt.execute(); 
rows_result.next();
num_rows = rows_result.getColumnValue(1);

while(i<num_rows) {

}

$$;

在这种情况下,如何在文件的每一行上循环,以便将列值作为新行一个接一个地插入?

换句话说,假设我有100行。我想在每一行上循环,并将其列值插入另一个表中,但要垂直插入。

下面的代码将演示从一个阶段读取多个列(2(,然后插入到一个表中。

这是我的目标表:

create or replace table target_Table( 
v1 varchar, v2 varchar,
v3 varchar, v4 varchar,
v5 varchar, v6 varchar);

这是文件中的数据:

select $1, $2 from @gokhan;
+-------+-------+
|  $1   |  $2   |
+-------+-------+
| zozo0 | hoho0 |
| zozo1 | hoho1 |
| zozo2 | hoho2 |
+-------+-------+

因此,该过程将从stage中读取这些行,然后将所有这些列组合为一行,并将其插入target_table:

CREATE PROCEDURE ADD_OBSERVATION_VALUES()
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var num_rows_sql = "SELECT $1, $2 FROM @gokhan (file_format => 'csv_format', pattern => '.*[.]csv.gz') t";
var stmt = snowflake.createStatement( {sqlText: num_rows_sql} );
var rows_result = stmt.execute(); 
var value_array = [];

while(rows_result.next()) {
value_array.push( rows_result.getColumnValue(1) );
value_array.push( rows_result.getColumnValue(2) );
}

snowflake.createStatement( { sqlText: 'INSERT INTO target_Table VALUES (?, ?, ?, ?, ?, ?)', 
binds: value_array } ).execute();    

return 'OK';
$$;

在存储过程中,我读取每一行(我假设它将有2列(,然后将它们推送到JavaScript数组(value_array(中。在读取完所有行之后,我将这些值发送到INSERT语句。当然,在发送之前,可以进行一些转换。据我所知,该文件中有3行,我没有设置任何限制,但为了避免任何错误,您可以在读取足够的数据后停止读取该文件。

这就是结果:

call ADD_OBSERVATION_VALUES();
select * from target_table;
+-------+-------+-------+-------+-------+-------+
|  V1   |  V2   |  V3   |  V4   |  V5   |  V6   |
+-------+-------+-------+-------+-------+-------+
| zozo0 | hoho0 | zozo1 | hoho1 | zozo2 | hoho2 |
+-------+-------+-------+-------+-------+-------+

最新更新