Untitled
unknown
sql
2 years ago
2.1 kB
4
Indexable
CREATE OR REPLACE FUNCTION mdm.codelco_get_inactive_materials( stages integer[], inactivities integer[], organization integer DEFAULT NULL::integer, creation_user uuid DEFAULT NULL::uuid ) RETURNS SETOF mdm.codelco_material_creation LANGUAGE plpgsql AS $function$ DECLARE query text := 'SELECT * FROM mdm.codelco_material_creation WHERE '; position integer; stage integer; BEGIN -- Solo hay un elemento en la lista IF array_length(stages, 1) = 1 THEN query := query || ' step_id = ' || stages[1]; IF organization IS NOT NULL THEN query := query || ' AND organization_division_id = ' || organization; END IF; IF creation_user IS NOT NULL THEN query := query || ' AND creation_user_id = ''' || creation_user || ''''; END IF; query := query || ' AND date_part(''day'', current_timestamp - updated_at)::integer >= ' || inactivities[1]; ELSE -- Hay más de un elemento en la lista position := 1; FOREACH stage IN ARRAY stages LOOP query := query || ' (step_id = ' || stage; -- Si organizacion no es null se agrega a la query IF organization IS NOT NULL THEN query := query || ' AND organization_division_id = ' || organization; END IF; -- Si creation_user no es null se agrega a la query IF creation_user IS NOT NULL THEN query := query || ' AND creation_user_id = ''' || creation_user || ''''; END IF; -- Si estoy en la ultima posicion del array no va el OR IF stage = stages[array_size] THEN query := query || ' AND date_part(''day'', current_timestamp - updated_at)::integer >= ' || inactivities[position] || ')' ; ELSE query := query || ' AND date_part(''day'', current_timestamp - updated_at)::integer >= ' || inactivities[position] || ') OR ' ; END IF; position := position + 1; END LOOP; END IF; RETURN QUERY EXECUTE query; END; $function$
Editor is loading...