---stored procedure
CREATE OR REPLACE PROCEDURE cdw.redshift_sample_sp() AS
$$ declare ROWCOUNT INT ;
rwnm INT;
printval INT ;
rec RECORD;
days_supplied INT;
sp_id INT;
lh_patient_id1 INT;
ship_dt DATE;
next_ship_dt1 DATE;
anticipated_dt DATE;
days_balance INT;
days_diff INT;
counter BIGINT;
BEGIN
-----------------Insert Into begins---------------------
BEGIN
execute ' CREATE TEMP TABLE tmp_variables AS (SELECT * FROM tmp_variables_new);';
RAISE info 'CREATED TEMP TABLE';
rwnm = (SELECT MAX(rownum) FROM tmp_variables);
days_balance = 0;
counter = 1;
RAISE info 'UPDATED COUNTER';
FOR rec IN select * FROM tmp_variables WHERE ROWNUM<=RWNM
RAISE info 'INSIDE FOR LOOP';
days_supplied = (SELECT days_supplied1 FROM tmp_variables WHERE rownum = counter);
RAISE info 'days_supplied = %', days_supplied;
sp_id = (SELECT sp_id1 FROM tmp_variables WHERE rownum = counter);
RAISE info 'sp_id = %', sp_id;
lh_patient_id1 = (SELECT lh_patient_id FROM tmp_variables WHERE rownum = counter);
RAISE info 'lh_patient_id1 = %', lh_patient_id1;
ship_dt = (SELECT ship_date FROM tmp_variables WHERE rownum = counter);
RAISE info 'ship_dt = %', ship_dt;
next_ship_dt1 = (SELECT next_ship_dt FROM tmp_variables WHERE rownum = counter);
RAISE info 'next_ship_dt1 = %', next_ship_dt1;
anticipated_dt = dateadd(d, days_supplied + days_balance, ship_dt)::DATE;
RAISE info 'days_balance = %', days_balance;
RAISE info 'Anticipated_dt = %', Anticipated_dt;
IF (anticipated_dt > next_ship_dt1)
days_balance = abs(datediff(d, anticipated_dt, next_ship_dt1));
RAISE info 'days_balance NOW = %', days_balance;
days_balance = 0;
RAISE info 'IF LOOP ENDS';
END IF;
execute 'UPDATE tmp_variables SET next_anticipated_ship_dt = '|| Anticipated_dt::DATE || ' WHERE ROWNUM=' || COUNTER;
RAISE info 'UPDATE STATEMENT ENDS';
counter = counter + 1;
RAISE info 'UPDATED COUNTER = %', COUNTER;
END LOOP;
END;
END;
LANGUAGE PLPGSQL;
COMMIT;
CALL cdw.redshift_sample_sp();
如何在Redshift PL/SQL存储过程中向表中更新日期?请分享Redshift存储过程中的更新语句语法
0
人关注
Shefali Arora
发布于
2020-04-30
1
个回答
Joe Harris
发布于
2020-05-05
0
人赞同
你在
UPDATE
语句中缺少一个结尾分号。修改的地方是
COUNTER ||';';
。
---stored procedure
CREATE OR REPLACE PROCEDURE CDW.redshift_sample_sp ()
AS $$
DECLARE
rowcount INT ;
rwnm INT;
printval INT ;
rec RECORD;
days_supplied INT;
sp_id INT;
lh_patient_id1 INT;
ship_dt DATE;
next_ship_dt1 DATE;
anticipated_dt DATE;
days_balance INT;
days_diff INT;
counter BIGINT;
BEGIN
-----------------Insert Into begins---------------------
EXECUTE ' CREATE TEMP TABLE tmp_variables AS (select * from tmp_variables_new);';
RAISE INFO 'CREATED TEMP TABLE';
rwnm = (SELECT MAX(rownum) FROM tmp_variables);
days_balance = 0;
counter = 1;
RAISE INFO 'UPDATED COUNTER';
FOR rec IN SELECT * FROM tmp_variables WHERE ROWNUM<=RWNM
RAISE INFO 'INSIDE FOR LOOP';
days_supplied=(SELECT days_supplied1 FROM tmp_variables WHERE rownum = counter);
RAISE INFO 'days_supplied = %', days_supplied;
sp_id=(SELECT sp_id1 FROM tmp_variables WHERE rownum = counter);
RAISE INFO 'sp_id = %', sp_id;
lh_patient_id1=(SELECT lh_patient_id from tmp_variables WHERE rownum = counter);
RAISE INFO 'lh_patient_id1 = %', lh_patient_id1;
ship_dt=(SELECT ship_date FROM tmp_variables WHERE rownum = counter);
RAISE INFO 'ship_dt = %', ship_dt;
next_ship_dt1= (SELECT next_ship_dt FROM tmp_variables WHERE rownum = counter);
RAISE INFO 'next_ship_dt1 = %', next_ship_dt1;
anticipated_dt = DATEADD(d, days_supplied + days_balance, ship_dt)::DATE;
RAISE INFO 'days_balance = %', days_balance;
RAISE INFO 'Anticipated_dt = %', anticipated_dt;
IF (anticipated_dt > next_ship_dt1) THEN
days_balance = ABS(DATEDIFF(d, anticipated_dt, next_ship_dt1));
RAISE INFO 'days_balance NOW = %', days_balance;
days_balance = 0;
RAISE INFO 'IF LOOP ENDS';
END IF;
EXECUTE 'UPDATE tmp_variables '
||' SET next_anticipated_ship_dt = '''||anticipated_dt::DATE
||''' WHERE rownum = ' || COUNTER ||';';
RAISE INFO 'UPDATE STATEMENT ENDS';
COUNTER=COUNTER+1;
RAISE INFO 'UPDATED COUNTER = %', COUNTER;
END LOOP;