I am trying to use temp tables inside functions. I am using this function inside a view.
When viewing it inside the Supabase table viewer everything works, but when trying to use the view in the front end, Supabase is telling me the 405 error.
I am using plpgsql
Here is the function with the temp tables:
DECLARE
v_working_day_count INT := 0;
v_date RECORD;
v_model_id BIGINT;
v_is_working_day INT;
BEGIN
-- Step 1: Retrieve all relevant working time model assignments for the user
CREATE TEMP TABLE temp_model_assignments AS
SELECT working_time_model_id, year, month
FROM types_working_time_model_assignment_records
WHERE user_id = p_user_id
AND (year < EXTRACT(YEAR FROM p_end_date)
OR (year = EXTRACT(YEAR FROM p_end_date) AND month <= EXTRACT(MONTH FROM p_end_date)))
ORDER BY year DESC, month DESC;
-- Step 2: Retrieve the relevant working time models
CREATE TEMP TABLE temp_working_time_models AS
SELECT id,
sunday_working_day,
monday_working_day,
tuesday_working_day,
wednesday_working_day,
thursday_working_day,
friday_working_day,
saturday_working_day
FROM types_working_time_models
WHERE id IN (SELECT DISTINCT working_time_model_id FROM temp_model_assignments);
-- Step 3: Loop through the dates and calculate working days
FOR v_date IN (SELECT generate_series(p_start_date, p_end_date, '1 day'::INTERVAL)::DATE AS g_date)
LOOP
-- Check if there are any model assignments
IF EXISTS (SELECT 1 FROM temp_model_assignments) THEN
-- Retrieve the working time model ID for the current date
SELECT working_time_model_id
INTO v_model_id
FROM temp_model_assignments
WHERE (year < EXTRACT(YEAR FROM v_date.g_date)
OR (year = EXTRACT(YEAR FROM v_date.g_date) AND month <= EXTRACT(MONTH FROM v_date.g_date)))
ORDER BY year DESC, month DESC
LIMIT 1;
-- Determine if the current date is a working day based on the retrieved model ID
SELECT (
CASE
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 0 AND sunday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 1 AND monday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 2 AND tuesday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 3 AND wednesday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 4 AND thursday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 5 AND friday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 6 AND saturday_working_day THEN 1
ELSE 0
END
) INTO v_is_working_day
FROM temp_working_time_models
WHERE id = v_model_id;
v_working_day_count := v_working_day_count + v_is_working_day;
ELSE
-- If there are no model assignments, count the day as 0 working day
v_working_day_count := v_working_day_count + 0;
END IF;
END LOOP;
-- Drop temporary tables
DROP TABLE temp_model_assignments;
DROP TABLE temp_working_time_models;
RETURN v_working_day_count;
END;
I have also created a second function that does not use temp tables:
DECLARE
v_working_day_count INT := 0;
v_date RECORD;
v_model_id BIGINT;
v_is_working_day INT;
BEGIN
-- Step 3: Loop through the dates and calculate working days
FOR v_date IN (SELECT generate_series(p_start_date, p_end_date, '1 day'::INTERVAL)::DATE AS g_date)
LOOP
-- Check if there are any model assignments
IF EXISTS (
SELECT 1
FROM types_working_time_model_assignment_records
WHERE user_id = p_user_id
AND (year < EXTRACT(YEAR FROM v_date.g_date)
OR (year = EXTRACT(YEAR FROM v_date.g_date) AND month <= EXTRACT(MONTH FROM v_date.g_date)))
) THEN
-- Retrieve the working time model ID for the current date
SELECT working_time_model_id
INTO v_model_id
FROM types_working_time_model_assignment_records
WHERE user_id = p_user_id
AND (year < EXTRACT(YEAR FROM v_date.g_date)
OR (year = EXTRACT(YEAR FROM v_date.g_date) AND month <= EXTRACT(MONTH FROM v_date.g_date)))
ORDER BY year DESC, month DESC
LIMIT 1;
-- Determine if the current date is a working day based on the retrieved model ID
SELECT (
CASE
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 0 AND sunday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 1 AND monday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 2 AND tuesday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 3 AND wednesday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 4 AND thursday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 5 AND friday_working_day THEN 1
WHEN EXTRACT(DOW FROM v_date.g_date::DATE) = 6 AND saturday_working_day THEN 1
ELSE 0
END
) INTO v_is_working_day
FROM types_working_time_models
WHERE id = v_model_id;
v_working_day_count := v_working_day_count + v_is_working_day;
ELSE
-- If there are no model assignments, count the day as 0 working day
v_working_day_count := v_working_day_count + 0;
END IF;
END LOOP;
RETURN v_working_day_count;
END;
When I use the second version in my view, I can access everything and do not get a 405 error. What could be the reason? I request the view with GET. Not using temp tables would be realy bad because otherwise the function would be realy inperformant. How someone can help me.
Seby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.