Problem polega na tym, że przekazujesz parametr (db_row
) typu record
do instrukcji SQL, ale taka wartość nie ma znanej struktury dla silnika SQL. Nie możesz nawet przesłać go do typu tabeli.
Jedno brzydkie obejście, jakie mogę sobie wyobrazić, polega na rzuceniu rekordu na jego reprezentację tekstową (co działa z wywołaniem funkcji wyjściowej typu), a następnie rzuceniu testu na żądany typ tabeli.
Oto przykładowy kod, który ilustruje, o co mi chodzi:
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;
$$;