英文:
how to insert the array as bind element in snowflake stored procedure?
问题
以下代码抛出错误,原因是undefined bind element
,因为数组包含在引号中的字符串,例如:["str1","str2","str3"]
CREATE OR REPLACE PROCEDURE sp_array(ARG ARRAY)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
let stmt = snowflake.createStatement({sqlText: `INSERT INTO TABLE1( VARIANT_COLUMN) SELECT ?`},binds:ARG})
stmt.execute();
$$;
英文:
The below code is throwing an error as undefined bind element
`because array contains string which is enclosed in quotes eg: ["str1","str2","str3"]
CREATE OR REPLACE PROCEDURE sp_array(ARG ARRAY)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
let stmt = snowflake.createStatement({sqlText: `INSERT INTO TABLE1( VARIANT_COLUMN) SELECT ?`},binds:ARG})
stmt.execute();
$$;
答案1
得分: 1
您可以传递一个数组,但数组不受支持作为绑定变量。您可以使用JSON.stringify将其转换为字符串,字符串受支持作为绑定变量。然后,您可以使用parse_json将其在SQL语句中转换为数组。这将强制存储过程的调用者提供有效的variant,因为这是指定的类型。但是,如果您想强制调用者提供有效的数组,您可以将输入类型更改为 "array",这将更紧密地定义类型。
create or replace table table1 (variant_column variant);
CREATE OR REPLACE PROCEDURE sp_array(ARG ARRAY)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
let stringifiedArray = JSON.stringify(ARG);
let stmt = snowflake.createStatement({sqlText: `INSERT INTO TABLE1( VARIANT_COLUMN) SELECT parse_json(?)`,binds:[ARG]});
stmt.execute();
$$;
call sp_array(array_construct('str1', 'str2', 'str3'));
call sp_array(['str1','str2','str3']);
select * from table1;
英文:
You can pass in an array, but arrays are not supported as bind variables. You can use JSON.stringify to convert it to a string, which is supported as a bind variable. You can then use parse_json to convert it to an array in the SQL statement. This will force the caller of the SP to supply a valid variant since that's the type specified. However, if you want to force the caller to supply a valid array, you can change the input type to "array" and this is more tightly typed.
create or replace table table1 (variant_column variant);
CREATE OR REPLACE PROCEDURE sp_array(ARG ARRAY)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
let stringifiedArray = JSON.stringify(ARG);
let stmt = snowflake.createStatement({sqlText: `INSERT INTO TABLE1( VARIANT_COLUMN) SELECT parse_json(?)`,binds:[ARG]});
stmt.execute();
$$;
call sp_array(array_construct('str1', 'str2', 'str3'));
call sp_array(['str1','str2','str3']);
select * from table1;
答案2
得分: 0
使用 TO_JSON
和 PARSE_JSON
:
创建或替换表 TABLE1(VARIANT_COLUMN VARIANT);
创建或替换过程 sp_array(ARG TEXT)
返回 VARCHAR
LANGUAGE JAVASCRIPT
如
$$
let stmt = snowflake.createStatement({
sqlText:INSERT INTO TABLE1(VARIANT_COLUMN)SELECT PARSE_JSON(?)
,binds:[ARG]}})
stmt.execute();
$$;
CALL sp_array(TO_JSON([1,2,3]));
CALL sp_array(TO_JSON([&39;a&39;,&39;b&39;]));
SELECT * FROM TABLE1;
-- [1, 2, 3]
-- ["a", "b"]
英文:
Using TO_JSON
and PARSE_JSON
:
CREATE OR REPLACE TABLE TABLE1( VARIANT_COLUMN VARIANT);
CREATE OR REPLACE PROCEDURE sp_array(ARG TEXT)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
let stmt = snowflake.createStatement({
sqlText:`INSERT INTO TABLE1( VARIANT_COLUMN) SELECT PARSE_JSON(?)`
,binds:[ARG]})
stmt.execute();
$$;
CALL sp_array(TO_JSON([1,2,3]));
CALL sp_array(TO_JSON(['a', 'b']));
SELECT * FROM TABLE1;
-- [ 1, 2, 3 ]
-- [ "a", "b" ]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论