如何在Redshift PL/SQL存储过程中向表中更新日期?请分享Redshift存储过程中的更新语句语法

0 人关注
---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();
    
stored-procedures
plsql
amazon-redshift
Shefali Arora
Shefali Arora
发布于 2020-04-30
1 个回答
Joe Harris
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;