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
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!!
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.
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.
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.
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".;