admin管理员组文章数量:1316000
I am trying to define a stored procedure in Snowflake as follows. But it is erroring out on the variable binding for :table_name
.
Error: `Syntax error: unexpected ‘into’
How do I achieve this?
CREATE OR REPLACE PROCEDURE SP__INSERT_TO_CUSTOMERS(table_name varchar)
RETURNS string
LANGUAGE SQL
AS
BEGIN
insert into :table_name (customer_name)
select distinct
customer_name
from orders;
RETURN ‘SUCCESS’;
END;
I am trying to define a stored procedure in Snowflake as follows. But it is erroring out on the variable binding for :table_name
.
Error: `Syntax error: unexpected ‘into’
How do I achieve this?
CREATE OR REPLACE PROCEDURE SP__INSERT_TO_CUSTOMERS(table_name varchar)
RETURNS string
LANGUAGE SQL
AS
BEGIN
insert into :table_name (customer_name)
select distinct
customer_name
from orders;
RETURN ‘SUCCESS’;
END;
Share
Improve this question
edited Jan 30 at 9:16
marc_s
756k184 gold badges1.4k silver badges1.5k bronze badges
asked Jan 29 at 23:18
Saqib AliSaqib Ali
4,44812 gold badges64 silver badges111 bronze badges
1
|
3 Answers
Reset to default 0Like @Barmar mentioned in comment, you can define a variable where you can prepare your sql statement and then execute it using EXECUTE IMMEDIATE
.
Example procedure which I tested by creating a sample order
and customer
table
CREATE OR REPLACE PROCEDURE SP__INSERT_TO_CUSTOMERS(table_name VARCHAR)
RETURNS STRING
LANGUAGE SQL
AS
$$
BEGIN
LET sql_insert STRING;
sql_insert := 'INSERT INTO ' || table_name || ' (customer_name)
SELECT DISTINCT customer_name FROM orders;';
EXECUTE IMMEDIATE sql_insert;
RETURN 'SUCCESS';
END;
$$;
Call the procedure
Check whether data is inserted in Customers
Looks like for table names we have to use the IDENTIFIER()
keyword as follows:
CREATE OR REPLACE PROCEDURE SP__INSERT_TO_CUSTOMERS(table_name varchar)
RETURNS string
LANGUAGE SQL
AS
BEGIN
insert into IDENTIFIER(:table_name) (customer_name)
select distinct
customer_name
from orders;
RETURN ‘SUCCESS’;
END;
In Snowflake, when using dynamic table names in stored procedures, you need to use the EXECUTE IMMEDIATE statement since table names can't be parameterized directly using bind variables. Here's the corrected version:
CREATE OR REPLACE PROCEDURE SP__INSERT_TO_CUSTOMERS(table_name varchar)
RETURNS string
LANGUAGE SQL
AS
$$
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO ' || :table_name || ' (customer_name)
SELECT DISTINCT customer_name
FROM orders';
RETURN 'SUCCESS';
END;
$$;
Key changes made:
- Used EXECUTE IMMEDIATE to construct and execute the dynamic SQL
- Concatenated the table name parameter with the rest of the SQL statement
- Added $$ delimiter marks which are required for stored procedures in Snowflake
You can then call the procedure like this:
CALL SP__INSERT_TO_CUSTOMERS('your_table_name');
本文标签: Passing a table name as a variable to Snowflake stored procedureStack Overflow
版权声明:本文标题:Passing a table name as a variable to Snowflake stored procedure - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741993072a2409499.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
PREPARE
andEXECUTE
. – Barmar Commented Jan 29 at 23:53