使用雪花中的存储过程将值插入 table
Inserting values into a table using stored procedure in snowflake
我需要将一个 table 的列名称插入另一个 table。
这是我的尝试:
我首先创建了一个 table 来插入列名
create or replace table TABLE1 (tab_name string, col_name string);
CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
var stmt = snowflake.createStatement({
sqlText: "SELECT * FROM " + TABLE_NAME + " LIMIT 1;",
});
stmt.execute();
var cols=[];
for (i = 1; i <= stmt.getColumnCount(); i++) {
cols.push(stmt.getColumnName(i));
}
//Values not being inserted into the table
for(i=0; i<cols.length;i++)
{
var stmt2 = snowflake.createStatement({
sqlText: "INSERT INTO TABLE1 VALUES(" + TABLE_NAME + "," + cols[i] + ")" + ";"
});
stmt2.execute();
}
return cols
$$;
当我打印出 TABLE1 时,我没有得到任何输出。我不明白我哪里做错了
当我执行你的存储过程时(假设 TABLE_NAME = FOO),它 return 是一个错误:
Execution error in store procedure GET_COLUMNS: SQL compilation error: error line 1 at position 26 invalid identifier 'FOO' At Statement.execute, line 18 position 15
如果您查看 SQL 历史记录,您将看到您正在生成以下 INSERT 语句:
INSERT INTO TABLE1 VALUES(FOO,COL1);
文字值周围缺少单引号;应该是:
INSERT INTO TABLE1 VALUES('FOO','COL1');
要更正此问题,您可以更改此内容:
var stmt2 = snowflake.createStatement({
sqlText: "INSERT INTO TABLE1 VALUES(" + TABLE_NAME + "," + cols[i] + ")" + ";"
});
对此:
var stmt2 = snowflake.createStatement({
sqlText: "INSERT INTO TABLE1 VALUES('" + TABLE_NAME + "','" + cols[i] + "')" + ";"
});
也就是说,我会从完全不同的角度来处理这个问题。检索元数据信息(例如列名)的更有效方法是通过 INFORMATION_SCHEMA 视图。如果您不需要 return 列名数组作为存储过程的输出,您可以使用这样的东西:
CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
let sql_insert = `
INSERT INTO TABLE1 (
tab_name
,col_name
)
SELECT TABLE_NAME
,COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ?
`;
snowflake.execute({"sqlText" : sql_insert, "binds" : [TABLE_NAME]});
return [];
$$
;
如果您确实需要存储过程 return 输出数组中的列名,那么您可以使用如下内容:
CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
let sql_get_cols = `
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ?
ORDER BY ORDINAL_POSITION
`;
let sql_insert = `
INSERT INTO TABLE1 (
tab_name
,col_name
)
VALUES (?, ?)
`;
let rs_get_cols = snowflake.execute({"sqlText" : sql_get_cols, "binds" : [TABLE_NAME]});
let cols = [];
while (rs_get_cols.next()) {
let column_name = rs_get_cols.getColumnValue(1);
snowflake.execute({"sqlText" : sql_insert, "binds" : [TABLE_NAME, column_name]});
cols.push(column_name);
}
return cols;
$$
;
此外还有其他变体。
我需要将一个 table 的列名称插入另一个 table。
这是我的尝试:
我首先创建了一个 table 来插入列名
create or replace table TABLE1 (tab_name string, col_name string);
CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
var stmt = snowflake.createStatement({
sqlText: "SELECT * FROM " + TABLE_NAME + " LIMIT 1;",
});
stmt.execute();
var cols=[];
for (i = 1; i <= stmt.getColumnCount(); i++) {
cols.push(stmt.getColumnName(i));
}
//Values not being inserted into the table
for(i=0; i<cols.length;i++)
{
var stmt2 = snowflake.createStatement({
sqlText: "INSERT INTO TABLE1 VALUES(" + TABLE_NAME + "," + cols[i] + ")" + ";"
});
stmt2.execute();
}
return cols
$$;
当我打印出 TABLE1 时,我没有得到任何输出。我不明白我哪里做错了
当我执行你的存储过程时(假设 TABLE_NAME = FOO),它 return 是一个错误:
Execution error in store procedure GET_COLUMNS: SQL compilation error: error line 1 at position 26 invalid identifier 'FOO' At Statement.execute, line 18 position 15
如果您查看 SQL 历史记录,您将看到您正在生成以下 INSERT 语句:
INSERT INTO TABLE1 VALUES(FOO,COL1);
文字值周围缺少单引号;应该是:
INSERT INTO TABLE1 VALUES('FOO','COL1');
要更正此问题,您可以更改此内容:
var stmt2 = snowflake.createStatement({
sqlText: "INSERT INTO TABLE1 VALUES(" + TABLE_NAME + "," + cols[i] + ")" + ";"
});
对此:
var stmt2 = snowflake.createStatement({
sqlText: "INSERT INTO TABLE1 VALUES('" + TABLE_NAME + "','" + cols[i] + "')" + ";"
});
也就是说,我会从完全不同的角度来处理这个问题。检索元数据信息(例如列名)的更有效方法是通过 INFORMATION_SCHEMA 视图。如果您不需要 return 列名数组作为存储过程的输出,您可以使用这样的东西:
CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
let sql_insert = `
INSERT INTO TABLE1 (
tab_name
,col_name
)
SELECT TABLE_NAME
,COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ?
`;
snowflake.execute({"sqlText" : sql_insert, "binds" : [TABLE_NAME]});
return [];
$$
;
如果您确实需要存储过程 return 输出数组中的列名,那么您可以使用如下内容:
CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
let sql_get_cols = `
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ?
ORDER BY ORDINAL_POSITION
`;
let sql_insert = `
INSERT INTO TABLE1 (
tab_name
,col_name
)
VALUES (?, ?)
`;
let rs_get_cols = snowflake.execute({"sqlText" : sql_get_cols, "binds" : [TABLE_NAME]});
let cols = [];
while (rs_get_cols.next()) {
let column_name = rs_get_cols.getColumnValue(1);
snowflake.execute({"sqlText" : sql_insert, "binds" : [TABLE_NAME, column_name]});
cols.push(column_name);
}
return cols;
$$
;
此外还有其他变体。