在继续由@Erwin Brandstetter 和@Craig Ringer 协助的先前案例中,我已将我的代码固定为如下。请注意,我的函数myresult()
现在输出text
,而不是表(事实上,正如前一种情况所指出的那样,输出表对象没有意义,因为我们需要在前面定义它的所有列,这基本上违反了整个目的):
CREATE OR REPLACE FUNCTION myresult(mytable text, myprefix text)
RETURNS text AS
$func$
DECLARE
myoneliner text;
BEGIN
SELECT INTO myoneliner
'SELECT '
|| string_agg(quote_ident(column_name::text), ',' ORDER BY column_name)
|| ' FROM ' || quote_ident(mytable)
FROM information_schema.columns
WHERE table_name = mytable
AND column_name LIKE myprefix||'%'
AND table_schema = 'public'; -- schema name; might be another param
RAISE NOTICE 'My additional text: %', myoneliner;
RETURN myoneliner;
END
$func$ LANGUAGE plpgsql;
称呼:
select myresult('dkj_p_k27ac','enri');
运行上述过程后,我得到一个文本字符串,它基本上是一个查询。为简单起见,我接下来将其称为“oneliner-output”。
'oneline-output' 如下所示(我只是从这里进入的一个输出单元复制/粘贴它):
"SELECT enrich_d_dkj_p_k27ac,enrich_lr_dkj_p_k27ac,enrich_r_dkj_p_k27ac FROM dkj_p_k27ac"
- 请注意,语句两边的双引号是
myresult()
输出的一部分。我没有添加它们。
我现在更好地理解了思考构建一个既可以创建“oneliner-output”又可以执行它的单个函数的有问题的想法。我可以将“oneliner-output”复制/粘贴到新的 Postgres 查询窗口中,并将其作为正常查询执行,在我的数据输出窗口中接收所需的列和行。
但是,我想自动执行此步骤,以避免复制/粘贴步骤。Postgres 有没有办法使用text
我从myresult()
函数接收的输出('oneliner-output')并执行它?是否可以创建第二个函数来接收输出myresult()
并将其用于执行查询?
沿着这些思路,虽然我知道以下脚本(如下)有效并且实际上输出了所需的列和行:
-- DEALLOCATE stmt1; -- use this line after the first time 'stmt1' was created
prepare stmt1 as SELECT enrich_d_dkj_p_k27ac,enrich_lr_dkj_p_k27ac,enrich_r_dkj_p_k27ac FROM dkj_p_k27ac;
execute stmt1;
我在想,在进行正确的调整之后,以下脚本可能会起作用吗?不知道如何。
prepare stmt1 as THE_OUTPUT_OF_myresult(); execute stmt1;
尝试使用 refcursor
CREATE OR REPLACE FUNCTION show_mytable(ref refcursor) RETURNS refcursor AS $$
BEGIN
OPEN ref FOR SELECT enrich_d_dkj_p_k27ac,enrich_lr_dkj_p_k27ac,enrich_r_dkj_p_k27ac FROM dkj_p_k27ac; -- Open a cursor
RETURN ref; -- Return the cursor to the caller
END;
$$ LANGUAGE plpgsql;
称呼:
BEGIN;
SELECT show_mytable('roy');
FETCH ALL IN "roy";
这个过程实际上可以工作并吐出所需的列和行,而且我必须再次提供准确的 SELECT 语句。
我基本上希望能够并提供它作为我的myresult()
函数的输出。像这样的东西:
CREATE OR REPLACE FUNCTION show_mytable(ref refcursor) RETURNS refcursor AS $$
BEGIN
OPEN ref FOR myresult(); -- Open a cursor
RETURN ref; -- Return the cursor to the caller
END;
$$ LANGUAGE plpgsql;
称呼:
BEGIN;
SELECT show_mytable('roy');
FETCH ALL IN "roy";