Reputation: 75
I'm trying to write a snowflake sql stored procedure to alter all tables in a database.
I know we can get a table names from querying information schema
eg: select table_name from DEMO_DB.INFORMATION_SCHEMA.TABLES;
I can do it for one table like below
create or replace procedure enable_change_tracking(TABLE_NAME varchar)
returns varchar
language javascript
as
$$
var my_sql_command = "ALTER table "+ TABLE_NAME +" SET CHANGE_TRACKING = TRUE;"
var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
var result_set1 = statement1.execute();
return 'Done.';
$$
;'''
call enable_change_tracking('table_name');
How do i pass the result set of '''select table_name from DEMO_DB.INFORMATION_SCHEMA.TABLES;''' to a above stored procedure?
Upvotes: 2
Views: 1624
Reputation: 75
Answer
create or replace procedure enable_change_tracking_st()
returns varchar
language javascript
as
$$
var my_sql_command = "select table_name from DEMO_DB.INFORMATION_SCHEMA.TABLES where table_schema = 'PUBLIC'"
var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
var r = statement1.execute();
while(r.next()) {
var table_name = r.getColumnValue(1);
var sub_q = "ALTER table "+ table_name +" SET CHANGE_TRACKING = TRUE;"
var statement2 = snowflake.createStatement( {sqlText: sub_q} );
var r2 = statement2.execute();
}
return 'Done';
$$
;
Upvotes: 2
Reputation: 332
I generally write something to produce a script. Usually a simple UDF which takes the table name and the desired DDL statement. That lets me test it without running it against everything. Once I've tested it, I then do something along the lines of: SELECT UDF_GEN_MY_QUERT(TABLE_NAME) FROM (SELECT TABLE_NAME FROM ...).
As an example, I have a meta-data table to created Snowflake object from Salesforce Object meta-data.
On Friday, I deployed 168 new/updated tables, VIEWs, STREAM and TASKs using this technique, into 4 databases (3 dev DBs, 1 INT DB.)
I will be publishing an article on Linkedin, Snowflake medium blog and my own wordpress blog shortly.
Upvotes: 1
Reputation: 1510
As Greg mentioned, you need to loop through the result in the SP:
create or replace procedure enable_change_tracking()
returns varchar
language javascript
as
$$
var my_sql_command = "select table_name from DEMO_DB.INFORMATION_SCHEMA.TABLES"
var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
var r = statement1.execute();
while(r.next()) {
table_name = r.getColumnValue('TABLE_NAME');
sub_q = "ALTER table "+ table_name +" SET CHANGE_TRACKING = TRUE;"
// run your query here
}
return a;
$$
;
Upvotes: 2