将 SELECT 的结果连接到 EXECUTE

Concatenate result of a SELECT into an EXECUTE

我正在尝试在匿名代码块 (DO $$ ... BEGIN... END$$) 中使用 EXECUTE 从定义的备份中重新创建视图,但我无法让它工作。这大约是我目前所拥有的:

EXECUTE 'CREATE VIEW image AS (' || (SELECT definition FROM tmp_view_backup WHERE viewname = 'image') || ')';

带有视图定义备份的table是这样制作的

CREATE TABLE  tmp_view_backup
AS
(select viewname,definition from pg_views
WHERE schemaname = 'public'
);

似乎是 select 导致我在创建字符串时遇到一些问题,因为结果与我预期的完全不同:

postgres=# select char_length('CREATE VIEW image AS ('  || (SELECT definition FROM tmp_view_backup WHERE viewname = 'image') || ')') as f ;
 f 
---

(1 row)

这是什么?空行?如果我删除 select 我会得到一个正常的答案(比如字符串长度是 23)。

您可以使用 PSQL \gexec 参数。

SELECT format('CREATE VIEW image AS  %s ', definition)
FROM tmp_view_backup 
WHERE viewname = 'image';\gexec  

或者在 DO 块中

DO $$
BEGIN

EXECUTE format('CREATE VIEW image AS  %s ', definition)
FROM  tmp_view_backup 
WHERE viewname = 'image';
END $$;