我有一个巨大的,可怕的构建数据库,我正在通过它运行查询以查找特定的数据,让我知道它的表和列。有没有办法让查询每次找到而不是在结尾时返回数据?
以下是对那些感兴趣的人的查询
CREATE OR REPLACE FUNCTION search_columns(
needle text,
haystack_tables name[] default '{}',
haystack_schema name[] default '{public}'
)
RETURNS table(schemaname text, tablename text, columnname text, rowctid text)
AS $$
begin
FOR schemaname,tablename,columnname IN
SELECT c.table_schema,c.table_name,c.column_name
FROM information_schema.columns c
JOIN information_schema.tables t ON
(t.table_name=c.table_name AND t.table_schema=c.table_schema)
WHERE (c.table_name=ANY(haystack_tables) OR haystack_tables='{}')
AND c.table_schema=ANY(haystack_schema)
AND t.table_type='BASE TABLE'
LOOP
EXECUTE format('SELECT ctid FROM %I.%I WHERE cast(%I as text)=%L',
schemaname,
tablename,
columnname,
needle
) INTO rowctid;
IF rowctid is not null THEN
RETURN NEXT;
END IF;
END LOOP;
END;
$$ language plpgsql;
--Search in all tables within public schema:
select * from search_columns('E0801');
在特定表格中搜索:
select * from search_columns('foobar','{w}');
搜索从select:
获得的表的子集select * from
grep_columns('foobar', array(select table_name::name from information_schema.tables where table_name like 's%'), array['public']);
获取带有相应基表的结果行和ctid:
select * from public.w where ctid='(0,2)';
答案 0 :(得分:1)
如果您的客户端程序异步显示通知,则可以使用RAISE NOTICE
。
在RAISE NOTICE
之前插入RETURN NEXT
并在psql中尝试:
...
IF rowctid is not null THEN
RAISE NOTICE '% % % %', schemaname, tablename, columnname, rowctid;
RETURN NEXT;
END IF;
...
答案 1 :(得分:0)