gpt4 book ai didi

sql - 从本地现有类型指定 dblink 列定义列表

转载 作者:行者123 更新时间:2023-11-29 11:15:59 36 4
gpt4 key购买 nike

我正在使用 dblink 在数据库之间移动某些数据。一切都保存完好,但我想知道是否有更方便的方法来定义 dblink 查询结果的列定义列表。我可以这样做:

SELECT *
FROM dblink('dbname=remote', 'select * from test')
AS t1(id integer, data text);

我正在与之交互的表在两个数据库(远程和本地)中具有相同的模式定义。我在想类似的事情:

SELECT *
FROM dblink('dbname=remote', 'select * from test')
AS t1 LIKE public.test;

或者:

SELECT *
FROM dblink('dbname=remote', 'select * from test')
AS t1::public.test;

列定义列表往往会变得很长。我可能忽略了什么吗?

编辑:

因为在我创建一个小函数作为解决方法之前,这对我来说一直是个问题。

CREATE OR REPLACE FUNCTION dblink_star_func(_conn text, _schema_name text, _table_name text)
RETURNS text
LANGUAGE PLPGSQL
VOLATILE STRICT
AS $function$
DECLARE
_dblink_schema text;
_cols text;
_q text;
_func_name text := format('star_%s', $3);
_func text;
BEGIN
SELECT nspname INTO _dblink_schema
FROM pg_namespace n, pg_extension e
WHERE e.extname = 'dblink' AND e.extnamespace = n.oid;

SELECT array_to_string(array_agg(column_name || ' ' || udt_name), ', ') INTO _cols
FROM information_schema.columns
WHERE table_schema = $2 AND table_name = $3;

_q := format('SELECT * FROM %I.dblink(%L, %L) AS remote (%s)',
_dblink_schema,
_conn,
format('SELECT * FROM %I.%I', $2, $3),
_cols
);

_func := $_func$
CREATE OR REPLACE FUNCTION %s()
RETURNS SETOF %I.%I
LANGUAGE SQL
VOLATILE STRICT
AS $$ %s; $$
$_func$;

EXECUTE format(_func, _func_name, $2, $3, _q);

RETURN _func_name;
END;
$function$;

此函数创建并生成一个包装 dblink 调用的函数。这当然不是为了繁重的工作,而是为了方便。如果事实证明根本没有必要,那就太好了。

> select dblink_star_func('dbname=ben', 'public', 'test');
┌──────────────────┐
│ dblink_star_func │
├──────────────────┤
│ star_test │
└──────────────────┘
(1 row)

> select * from star_test() where data = 'success';
┌────┬─────────┐
│ id │ data │
├────┼─────────┤
│ 1 │ success │
└────┴─────────┘
(1 row)

最佳答案

尝试这样的事情:

select (rec).* from dblink('dbname=...','select myalias from foreign_table
myalias') t1 (rec local_type)

示例(从其他数据库获取表统计信息):

select (rec).* from dblink('dbname=foreignDb','select t1 from
pg_stat_all_tables t1') t2 (rec pg_stat_all_tables)

关于sql - 从本地现有类型指定 dblink 列定义列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18317216/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com