Das Problem ist, dass Sie einen Parameter übergeben (db_row
) vom Typ record
zu einer SQL-Anweisung, aber ein solcher Wert hat keine bekannte Struktur für die SQL-Engine. Sie können es nicht einmal in den Tabellentyp umwandeln.
Eine hässliche Problemumgehung, die mir einfällt, besteht darin, den Datensatz in seine Textdarstellung umzuwandeln (was mit einem Aufruf der Typausgabefunktion funktioniert) und dann den Test in den gewünschten Tabellentyp umzuwandeln.
Dies ist Beispielcode, der veranschaulicht, was ich meine:
DO $$
DECLARE
r record;
n name;
BEGIN
/* find all tables with a column "oid" */
FOR r IN
SELECT t.*
FROM pg_class t
JOIN pg_attribute a ON a.attrelid = t.oid
WHERE a.attname = 'oid'
LOOP
/* get the table name */
EXECUTE format(
'SELECT ($1::text::%s).relname',
'pg_class'
) INTO n USING r;
RAISE NOTICE 'Table name: %', n;
END LOOP;
END;
$$;