creation of store procedure in aws redshift - amazon-web-services

While creating the store procedure to create the table in redshift, I am not able to create the table by concatenating with current date. could please help me anyone.
Here is my code :
create or replace procedure stud.studentlists()
as $$
declare get_date date;
begin
execute 'CREATE TEMP TABLE stud.students_list_||"get_date"
as
select * from stud.students_list;
'
end
$$ LANGUAGE plpgsql;

Related

Possible to parametrize redshift COPY command?

Below is my stored procedure where I am trying to parametrize the COPY command in redshift:
CREATE OR REPLACE PROCEDURE myproc (accountid varchar(50),rolename varchar(50)) LANGUAGE PLPGSQL AS $$ BEGIN
/*copy csv data from s3 into the table*/
COPY mydb.my_table
FROM 's3://extracts/raw/data.csv'
credentials
'aws_iam_role=arn:aws-us-gov:iam::<accountid>:role/<rolename>;'
IGNOREHEADER 1 CSV
FILLRECORD;
commit;
However the account id and rolename parameters are not getting passed through the COPY command. Is it possible to do something like this? Any ideas on what I am missing here?
Followed the example here and it worked correctly
CREATE OR REPLACE PROCEDURE myproc (table_name in VARCHAR, s3_path in VARCHAR, iam_role in VARCHAR) LANGUAGE PLPGSQL AS $$ BEGIN
/*copy csv data from s3 into the table*/
EXECUTE 'COPY '|| table_name ||' FROM '||CHR(39)|| s3_path ||CHR(39)||' IAM_ROLE '||CHR(39)|| iam_role ||CHR(39)||' IGNOREHEADER 1 CSV
FILLRECORD;';
commit;
This worked!!

How to do a simple loop for insert in Amazon Redshift?

I would like to do a very simple pl/sql transaction with loop and for to insert values into a table. It should work like this:
CREATE PROCEDURE cs_refresh_reports() AS $$
DECLARE
last_nps RECORD;
BEGIN
FOR last_nps IN SELECT "date" FROM table_1 ;
LOOP
EXECUTE insert into table_2 ("value") select "value" from table_3 where "date" = :last_nps ;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
Very simple but I didn't find any solution for this and if I try I just get errors.

Redshift stored procedure having issue in while loop syntax error near "integer"

Working on Amazon Redshift stored procedure. Having issue in while loop syntax error near "integer"
create or replace procedure WHILE_COM(REC_COUNT INT)
AS $$
DECLARE
I INTEGER =1
SET REC_COUNT=SELECT COUNT(*) FROM table
BEGIN
WHILE I<=REC_COUNT LOOP
WITH FIRST_RECORD AS
(SELECT * FROM ods_epremis.new_old_merge
where new_old_merge.claim_oid IN(select TOP 1 claim_oid from ods_epremis.new_old_merge order by clain_oid)),
MERGE_RECORD AS
(SELECT * from ode_epremis.new_old_merge JOIN FIRST_RECORD
ON T1_accountno=T2_accountno)
insert into targettable (select * from MERGE_RECORD)
I=I+1
END LOOP
END
$$ LANGUANGE plpgsql;
Based on the examples from Structure of PL/pgSQL - Amazon Redshift, variables should be set with := rather than just =:
CREATE PROCEDURE update_value() AS $$
DECLARE
value integer := 20;
BEGIN
...
It also shows colons (;) at the end of commands.

AWS Redshift dynamically select column name from RECORD

I have created below procedure in AWS redshift.
In the query2 (at ????) I want to select the column from rec based on value provided in field input variable.
e.g. if field = 'Fname' then in query2 it should insert rec.Fname.
Please let me know how to select column names dynamically from RECORD in open cursor.
CREATE OR REPLACE PROCEDURE test3(source_table varchar(100), target_table varchar(100), field varchar(100) )
LANGUAGE plpgsql
AS $$
declare
query1 text;
query2 text;
rec RECORD;
begin
query1 := 'SELECT id, ' || field ||', load_date, end_date FROM ' || source_table || ' ORDER BY id, load_date';
FOR rec IN execute query1
loop
query2 := 'insert into '|| target_table ||' values ('||quote_literal(rec.id)||', '||quote_literal(field)||','||**????**||','||quote_literal(rec.load_date)||')';
execute query2;
END LOOP;
RETURN;
END;
$$
;
It is early here so let me just reference an answer I gave for a similar situation (inserting instead of selecting). This should get you started - How to join System tables or Information Schema tables with User defined tables in Redshift
The code looks like:
CREATE OR REPLACE procedure rewrite_data()
AS
$$
DECLARE
row record;
BEGIN
drop table if exists fred;
create table fred (schemaname varchar(256),tablename varchar(256),"column"varchar(256), "type"varchar(256));
for row in select "schemaname"::text, "tablename"::text, "column"::text, "type"::text from pg_table_def where "schemaname" <> 'pg_catalog' LOOP
INSERT INTO fred(schemaname,tablename,"column","type") VALUES (row.schemaname,row.tablename,row."column",row."type");
END LOOP;
END;
$$ LANGUAGE plpgsql;
call rewrite_data();
select * from fred;
Given that you have gotten this far on your stored procedure this should get you over the finish line.

Save stored procedure result set in a table

I have created a stored procedure that returns the distinct table_schema name. My database is using redshift and I am using SQL workbench/J to create it.
As recommended by AMAZON Redshift, we can use a cursor to return the result set. Below is my code.
CREATE OR REPLACE PROCEDURE get_dist_schema(rsout INOUT refcursor)
AS $$
BEGIN
OPEN rsout FOR SELECT DISTINCT table_schema FROM information_schema.tables;
END;
$$ LANGUAGE plpgsql;
BEGIN;
CALL get_dist_schema('sname');
FETCH ALL FROM sname;
commit;
Result from FETCH ALL FROM sname is as shown below:
table_schema
tableA
tableB
tableC
tableD
I want to save the result in a table such that when I do select statement for a table, the same result will appear.
I have tried this:
BEGIN;
CALL get_dist_schema('sname');
FETCH ALL FROM sname INTO public.distTable
The error say:
Invalid operation: syntax error at or near "INTO"
Position: 22;
Is there any way I can save the result into a table?
FETCH ALL FROM sname INTO public.distTable
UPDATE:
IF I USE SELECT INTO:
CREATE OR REPLACE PROCEDURE get_dist_schema(rsout INOUT refcursor)
AS $$
BEGIN
OPEN rsout FOR SELECT DISTINCT table_schema INTO public.distTable FROM information_schema.tables;
END;
$$ LANGUAGE plpgsql;
ERROR:
CALL get_dist_schema('sname')
[Amazon](500310) Invalid operation: Column "table_schema" has unsupported type "information_schema.sql_identifier".;