以下に示す関数find_value_in_table()
で、列の値が文字列「255.255.255.255」と一致するレコードを持つ列の名前を見つけようとしています。
要するに、このようなもの:
SELECT column_name
FROM dynamic_table
WHERE column_value = '255.255.255.255';
ノート:
- テーブルの名前はパラメータとして関数に渡されるため、「dynamic_table」
- データ値ではなく、列の名前を判別しようとしています。
これが最初のステップです。後で、column_valueもパラメーター化します。値を格納しているテーブルがあることを知っているので、"255.255.255.255"
この値を格納しているテーブルと列の名前を見つけて、この関数の機能を証明したいと思います。
このすべての目的:私は大きなデータベースを持っており、それをレトロエンジニアリングしています。私はそれがどこかに、アプリケーションのいくつかの構成パラメーターを含んでいることを知っています。現在の構成では、これらのパラメーターのいくつかの正確な値を知っています(アプリケーション構成GUIに表示されます:コンピューター名、IPアドレスなど)。この構成情報を格納しているテーブルを特定するために、データベース全体を参照したいと思います。
find_value()
私はこれらの手がかりを返す関数を構築してきました。
これはどのように行うことができますか?
create or replace function find_all_columns(tablename in text)
return setof record as
$func$
declare r record;
begin
return select a.attname as "Column",
pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
from
pg_catalog.pg_attribute a
where
a.attnum > 0
and not a.attisdropped
and a.attrelid = ( select c.oid from pg_catalog.pg_class c left join pg_catalog.pg_namespace n on n.oid = c.relnamespace where c.relname ~ '^(' || quote_ident(tablename) || ')$' and pg_catalog.pg_table_is_visible(c.oid);
end loop;
end;
$func$ language 'plpgsql';
create or replace function find_value_in_table(tablename text)
returns setof record as
$func$
declare r record;
return select
begin
for r in (select find_all_columns(tablename)) loop
return select * from tablename t where t... = "255.255.255.255" /* here column would be the value in the record: r.Column*/
end loop;
end;
$func$ language 'plpgsql';
create or replace function find_tables_name(_username text)
returns setof record as
$func$
declare
tbl text;
begin
for tbl in
select t.tablename from pg_tables t
where t.tableowner = _username and t.schemaname = 'public'
loop
return quote_ident(tbl);
end loop;
end;
$func$ language 'plpgsql';
create or replace function find_value(_username text, valuetofind text)
returns setof record as
$func$
declare r record;
begin
for r in (select find_tables_name(_username)) loop
return find_value_in_table( r.tablename );
end loop;
end;
$func$ language 'plpgsql';