HI Team,

This is the Function I have created successfully but while executing it
throughs an error temp table doesn't exist.

But the same when I execute it not inside the function from **drop temp
table to end insert select ** it work fine

Please can any one help me why in the function i am not able to create the
temp table. what is alternative


    `-- FUNCTION: api.post_publish_Roster()

    -- DROP FUNCTION IF EXISTS api."post_publish_Roster"();

    CREATE OR REPLACE FUNCTION api."post_publish_Roster"(
    )
        RETURNS void
        LANGUAGE 'sql'
        COST 100
        VOLATILE PARALLEL UNSAFE
    AS $BODY$

    DROP TABLE IF EXISTS ROSTER_TABLE;


    CREATE TEMP TABLE ROSTER_TABLE AS
    SELECT ROSTER_ID,
    LINK_ID,
    PAYNUMBER,
    USERNAME,
    LINE_POSITION,
    CREWNAME,
    WEEKNUMBER,
    WEEKSTARTDATE,
    WEEKENDDATE
    FROM CREW_LINKS.LINKS_MAP
    CROSS JOIN LATERAL GET_WEEKS('2023-02-12',

    '2023-03-04') AS WEEKDATA
    WHERE ROSTER_ID = 234
    AND WEEKDATA.WEEKNUMBER in
    (SELECT MIN(WEEKNUMBER)
    FROM GET_WEEKS('2023-02-12',

    '2023-03-04'));

    DO $$
    DECLARE
       weekstart INTEGER;
       weekend INTEGER ;
    BEGIN
       select min(weeknumber) into weekstart  from  get_weeks('2023-02-12',
'2023-03-04');
       select max(weeknumber) into weekend  from  get_weeks('2023-02-12',
'2023-03-04') ;

       WHILE weekstart < weekend LOOP
          INSERT INTO roster_table
          SELECT roster_id, link_id, paynumber, username, line_position+1
AS line_position ,  crewname,rt.weeknumber+1 AS weeknumber
                ,w.weekstartdate,w.weekenddate
                FROM roster_table rt
    INNER JOIN
    (select  * from  get_weeks('2023-02-12', '2023-03-04'))w
    ON w.weeknumber=rt.weeknumber+1
                WHERE rt.weeknumber=weekstart;

          update roster_table rw
          set line_position=(select min(line_position) from roster_table )
          where weeknumber=weekstart+1 and line_position =(select
MAX(line_position) from roster_table ) ;

          weekstart := weekstart + 1;
       END LOOP;
    END $$;

    WITH COMBIN AS
    (SELECT R.DEPOT,
    R.GRADE,
    R.VALID_FROM,
    R.VALID_TO,
    RD.ROWNUMBER,
    RD.SUNDAY,
    RD.MONDAY,
    RD.TUESDAY,
    RD.WEDNESDAY,
    RD.THURSDAY,
    RD.FRIDAY,
    RD.SATURDAY,
    RD.TOT_DURATION
    FROM CREW_ROSTER.ROSTER_NAME R
    JOIN CREW_ROSTER.DRAFT RD ON R.R_ID = RD.R_ID
    WHERE R.R_ID = 234),
    div AS
    (SELECT DEPOT,
    GRADE,
    VALID_FROM,
    VALID_TO,
    ROWNUMBER,
    UNNEST('{sunday,
    monday,
    tuesday,
    wednesday,
    thursday,
    friday,
    saturday }'::text[]) AS COL,
    UNNEST(ARRAY[ SUNDAY :: JSON,

    MONDAY :: JSON,
    TUESDAY :: JSON,
    WEDNESDAY :: JSON,
    THURSDAY :: JSON,
    FRIDAY :: JSON,
    SATURDAY:: JSON]) AS COL1
    FROM COMBIN),
    DAY AS
    (SELECT date::date,
    TRIM (BOTH TO_CHAR(date, 'day'))AS DAY
    FROM GENERATE_SERIES(date '2023-02-12', date '2023-03-04',interval '1
day') AS T(date)), FINAL AS
    (SELECT *
    FROM div C
    JOIN DAY D ON D.DAY = C.COL
    ORDER BY date,ROWNUMBER ASC), TT1 AS
    (SELECT ROWNUMBER,date,COL,
    (C - >> 'dia_id') :: UUID AS DIA_ID,
    (C - >> 'book_on') ::TIME AS BOOK_ON,
    (C - >> 'turn_no') ::VARCHAR(20) AS TURN_NO,
    (C - >> 'Turn_text') ::VARCHAR(20) AS TURN_TEXT,
    (C - >> 'book_off') :: TIME AS BOOK_OFF,
    (C - >> 'duration') ::interval AS DURATION
    FROM FINAL,
    JSON_ARRAY_ELEMENTS((COL1)) C),
    T1 AS
    (SELECT ROW_NUMBER() OVER (ORDER BY F.DATE,F.ROWNUMBER)AS R_NO,
    F.DEPOT,
    F.GRADE,
    F.VALID_FROM,
    F.VALID_TO,
    F.ROWNUMBER,
    F.COL,
    F.COL1,
    F.DATE,
    F.DAY,
    T.DIA_ID,
    T.BOOK_ON,
    T.TURN_NO,
    T.TURN_TEXT,
    T.BOOK_OFF,
    T.DURATION
    FROM TT1 T
    FULL JOIN FINAL F ON T.ROWNUMBER = F.ROWNUMBER
    AND T.DATE = F.DATE
    AND T.COL = F.COL),
    T2 AS
    (SELECT *,
    GENERATE_SERIES(WEEKSTARTDATE,

    WEEKENDDATE, interval '1 day')::date AS D_DATE
    FROM ROSTER_TABLE
    ORDER BY D_DATE,
    LINE_POSITION)
    INSERT INTO CREW_ROSTER.PUBLISH_ROSTER
(PAYNUMBER,DEPOT,GRADE,R_ID,ROSTER_DATE,DAY,TURNNO,TURNNO_TEXT,BOOK_ON,BOOK_OFF,DURATION,DIAGRAM_ID,INSERTION_TIME)
    SELECT PAYNUMBER,DEPOT,GRADE,ROSTER_ID, date, DAY,TURN_NO, TURN_TEXT,
BOOK_ON, BOOK_OFF, DURATION, DIA_ID,NOW()
    FROM T1
    INNER JOIN T2 ON T2.D_DATE = T1.DATE
    AND T2.LINE_POSITION = T1.ROWNUMBER
    ORDER BY D_DATE,
    LINE_POSITION ASC$BODY$;

    ALTER FUNCTION api."post_publish_Roster"()
        OWNER TO postgres;

    GRANT EXECUTE ON FUNCTION api."post_publish_Roster"() TO PUBLIC;

    GRANT EXECUTE ON FUNCTION api."post_publish_Roster"() TO postgres;

    GRANT EXECUTE ON FUNCTION api."post_publish_Roster"() TO readonlyrole;

    GRANT EXECUTE ON FUNCTION api."post_publish_Roster"() TO readwriterole;

    `
It throws this error....

[image: pgAdmin.png]

Reply via email to