我正在尝试创建一个脚本来调用 PostgreSQL 中的多个存储过程并打印其中一些的结果:
CREATE OR REPLACE FUNCTION script(
vtoken character varying)
RETURNS void AS
$BODY$
DECLARE
aux character varying;
BEGIN
PERFORM (SELECT acquire_table(vtoken));
-- This query gets the dynamically generated token for the client in that codebar
aux := (SELECT token
FROM clients c JOIN tables t ON c.tablekey = t.tablekey
WHERE codebar = vtoken);
PERFORM (SELECT order_drinks(aux, '{1}', '{1}'));
--EXECUTE (SELECT issue_ticket(aux));
PERFORM (SELECT order_drinks(aux, '{1}', '{1}'));
END;$BODY$
LANGUAGE plpgsql VOLATILE
Run Code Online (Sandbox Code Playgroud)
issues_ticket() 函数返回多行结果,我想直接打印它并继续执行下一个函数(order_drinks())。如果我执行 PERFORM,它不会显示结果,如果我只是尝试按原样执行 SELECT 查询,它会要求将返回值分配给变量。
通常的方法是使用返回行集returns table。然后调用该函数的客户端可以打印它。该函数本身在return. 例如:
create or replace function script()
RETURNS TABLE (col1 int)
language plpgsql
as $_$ begin
RETURN QUERY (VALUES (6), (7), (6*7));
RAISE NOTICE 'continuing after return';
end;
$_$;
select * from script();
Run Code Online (Sandbox Code Playgroud)
这打印:
NOTICE: continuing after return
col1
------
6
7
42
(3 rows)
Run Code Online (Sandbox Code Playgroud)
您还可以将函数的结果存储在(临时)表中:
create or replace function script2()
returns table (col1 int)
language plpgsql
as $_$
begin
CREATE TEMPORARY TABLE temp_table (id int) ON COMMIT DROP;
INSERT INTO temp_table SELECT * FROM script();
return query (select * from temp_table);
end;
$_$;
select * from script2();
Run Code Online (Sandbox Code Playgroud)
这打印:
NOTICE: continuing after return
CONTEXT: SQL statement "insert into temp_table select * from script() s where s.col1 < 42"
PL/pgSQL function script2() line 4 at SQL statement
col1
------
6
7
(2 rows)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20104 次 |
| 最近记录: |