Skip to main content

Snowflake Scripting - SQL Cursors

Snowflake scripting in SQL seems to be in preview and I have decided to have a play with it. Given how new it is there is limited documentation so I am using a combination of what I can find on the Snowflake site and the odd blog that has been written about it. There appear to be a few quirks, at least when compared to Oracle PL/SQL (though that has been round for years). How many of these are intentional and how many are things to be ironed out I don't know. You can see the procedure I have created it: 

  • Accepts an id as a parameter 
  • Creates a result set selecting from a table, using the parameter as a filter
  • Loads the results set into a cursor. 
  • Loops through the cursor loading the id in the cursor into variable
  • Calls procedure passing in the variable as the parameter. 
Then as a proof of concept I tried the Snowflake feature of allowing declaration of variables within the main start and end block. 


-- standard create or replace procedure
create or replace procedure p_run_source(p_source_id number) returns number
language sql as
-- declare to add variables
declare
-- make results for query, allows parameter to be passed in, putting SQL directly in a cursor this did not work
res RESULTSET := (select csl_id as id
from KEBOOLA_7127.WORKSPACE_15661914.ICE_CONTROL_SOURCE_LINK
where source_id = :p_source_id
);
-- make a cursor from the results set
c1 CURSOR FOR res;
-- a variable, required for later
numtest number default 0;
begin
-- Start the for loop, running for records in cursor c1
FOR record IN c1 DO
-- set variable = id from the cursor
numtest := record.id;
-- call other procedure using the set parameter, passing id straight in failed
call p_run_control(:numtest);
-- end the for loop
END FOR;
end ;
-- in snowflake scripting you can also skip the declare and use the LET syntax to declare within the begin and end block
create or replace procedure p_run_source(p_source_id number) returns number
language sql as
begin
LET res RESULTSET := (select csl_id as id
from KEBOOLA_7127.WORKSPACE_15661914.ICE_CONTROL_SOURCE_LINK
where source_id = :p_source_id
);
LET c1 CURSOR for res;
LET numtest number default 0;
FOR record in c1 DO
numtest := record.id;
call p_run_control(:numtest);
END FOR;
return numtest;
end ;

Comments

Popular posts from this blog

AWS training cloud academy free course

One of the things I like about this course are the instructors are really clear but also that it provides free labs that allow you to actually sign into AWS and perform some actions to actually create and do things without worrying that you are going to incur a cost.  Today I complete one of the hands on labs.  This was to create a lambda function, in this case it was a very basic python script that was searching a website for a keyword. I then placed this into a schedule and used cloudwatch to create a dashboard that monitored the running of this function. Overall it was a very simple use case but it was also a very simple process to setup.  I don't have much to add to this other than it is well worth signing up to cloud academy for the free training if nothing else, I am tempted, once i have done some more training, to give the paid for option a go to get the full sandboxes. 

AI News

Here’s a concise roundup of the latest AI news from the past couple of days: AI Technology: Friend or Foe? Researchers and experts continue to debate the impact of artificial intelligence. Is it a boon or a threat? The discussion ranges from AI ethics to its potential in various fields. Read more here . 5 Ways Artificial Intelligence Will Change the World by 2050 Futurists predict that AI will revolutionize our lives in the coming decades. From healthcare to transportation, AI is set to transform industries. Explore the possibilities here . How AI Will Transform Businesses in 2023 Business leaders are embracing AI to enhance efficiency, decision-making, and customer experiences. Stay updated on the latest AI trends in the corporate world here . China’s High-Level AI Modules China is pushing the boundaries of AI with modular next-generation systems. These high-level AI technologies promise breakthroughs in fields like robotics, healthcare, and smart cities. Learn more here . The Future ...

Data Cleansing View in Snowflake

For part of one of my free ETLs I am using Zapps to transfer e-mails from Google Sheets and then Keboola to transfer the sheets into my Snowflake database. I am familiar with string searches and cleansing in Oracle and using python but have not had the chance to do this in Snowflake. I wanted to give it a go as a proof of concept if nothing else. There were some difference in functions between Oracle and Snowflake, no INSTR and using POSITION instead and some difference in working with dates / timestamps but overall it was very similar.  The code below is what I ended up using:  I think want to use this to create some overview graphics to allow me to track the success or failure of my ETLs. Assuming the aspects of Retool remain free you can see how much ETL is going on this link .  In case things aren't working, here is a table of the output I am producing.