2016-08-03 10 views
1

大規模で恐ろしく構築されたデータベースがあり、特定のデータを見つけてそのテーブルと列を知らせるためにクエリを実行しています。最終的にではなく、何かを見つけるたびにクエリがデータを返すようにする方法はありますか?以下Postgresql:検索結果の末尾に見つからない結果を返します

特定のテーブルで興味のある方

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 * 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)'; 

答えて

1

RAISE NOTICEクライアントプログラムが通知を非同期的に表示する場合は、RAISE NOTICEを使用できます。 RETURN NEXT

挿入RAISE NOTICEとpsqlでそれを試してみてください。

... 
IF rowctid is not null THEN 
    RAISE NOTICE '% % % %', schemaname, tablename, columnname, rowctid; 
    RETURN NEXT; 
END IF; 
... 
+0

私はこれを試してみましょう、私は少なくともこの感謝を理解する! –

+0

btwは試してみました。ありがとう!! –

0

あなたはそれを使用してCURSORFETCHを宣言することができます。明示的な取引の内側にある必要があります。あなたが機能を変更するために満足している場合

BEGIN; 
DECLARE CURSOR mycurs FOR SELECT * FROM search_columns(...); 
FETCH FORWARD 5 FROM mycurs; 
-- repeat as needed 
ROLLBACK; 

は、あなたはそれがREFCURSORを返すことができます。これにより、PostgreSQLはいくつかの行を早期に返すように計画を変えることができます(これにより、クエリ全体のコストが高くなる可能性があります)。あなたの特定の例では、これは起こりそうにないようです。

+0

私は答えを理解することができますので、今より多くの研究を行う素晴らしいです!ありがとう! –

+0

これらのものとの戦いの半分は、検索するための適切な用語を見つけることです。 –

+0

あなたの回答をよりうまく利用するために、私はより大きな訓練を受けたいと思っています。ありがとう、束。私はそれを試し続けます。 –

関連する問題