Tengo la siguiente consulta que obtiene todas las secuencias y sus esquemas:
SELECT sequence_schema as schema, sequence_name as sequence FROM information_schema.sequences WHERE sequence_schema NOT IN ('topology', 'tiger') ORDER BY 1, 2 Me gustaría obtener el valor actual de cada nombre de secuencia con algo como select last_value from [sequence]; . He intentado lo siguiente (y un par de variaciones), pero no funciona porque la sintaxis no es correcta:
DO $$ BEGIN EXECUTE sequence_schema as schema, sequence_name as sequence, last_value FROM information_schema.sequences LEFT JOIN ( EXECUTE 'SELECT last_value FROM ' || schema || '.' || sequence ) tmp ORDER BY 1, 2; END $$;He encontrado algunas soluciones que crean funciones para ejecutar texto o armar una consulta dentro de una función y devolver el resultado, pero preferiría tener una sola consulta que pueda ejecutar y modificar como quiera.
En Postgres 12, puede usar pg_sequences :
select schemaname as schema, sequencename as sequence, last_value from pg_sequencesPuede confiar en la función pg_sequence_last_value
SELECT nspname as schema, relname AS sequence_name, coalesce(pg_sequence_last_value(s.oid), 0) AS seq_last_value FROM pg_class AS s JOIN pg_depend AS d ON d.objid = s.oid JOIN pg_attribute a ON d.refobjid = a.attrelid AND d.refobjsubid = a.attnum JOIN pg_namespace nsp ON s.relnamespace = nsp.oid WHERE s.relkind = 'S' AND d.refclassid = 'pg_class'::regclass AND d.classid = 'pg_class'::regclass AND nspname NOT IN ('topology', 'tiger') ORDER BY 1,2 DESC;Aquí hay una solución que no depende de pg_sequences o pg_sequence_last_value :
CREATE OR REPLACE FUNCTION get_sequences() RETURNS TABLE ( last_value bigint, sequence_schema text, sequence_name text ) LANGUAGE plpgsql AS $func$ DECLARE s RECORD; BEGIN FOR s IN SELECT t.sequence_schema, t.sequence_name FROM information_schema.sequences t LOOP RETURN QUERY EXECUTE format( 'SELECT last_value, ''%1$s''::text, ''%2$s''::text FROM %1$I.%2$I', s.sequence_schema, s.sequence_name ); END LOOP; END; $func$; SELECT * FROM get_sequences();Eso generará una tabla como esta:
last_value | sequence_schema | sequence_name ------------+-----------------+------------------------------------------------------- 1 | public | contact_infos_id_seq 1 | media | photos_id_seq 2006 | company | companies_id_seq 2505 | public | houses_id_seq 1 | public | purchase_numbers_id_seq ... etcLas otras respuestas solo funcionarán si tiene una versión moderna de Postgres (creo que 10 o más).