[英]postgres: how to call a function that returns a table and pass params from a query
[英]Postgres - How to use variables to call a function and returns a table/rowset from DBeaver/pgAdmin
我是 Postgres 的新手。 我尝试在 pgAdmin/DBeaver 中运行以下命令,但出现“错误:查询没有结果数据的目的地”错误
do $$
declare customerid integer := 151;
begin
SELECT * FROM get_orders(customerid);
end $$
我的直觉告诉我,这很简单。 我需要更改哪些内容才能在 DBeaver 或 pgAdmin 中显示结果?
我不想要这样的东西:
SELECT * FROM get_orders(151);
我确实想使用变量之类的东西与实际的 select 语句分开。 谢谢。
准备表/函数的脚本段
------------------
CREATE TABLE orders
(
id integer,
customerid INTEGER,
description varchar(100)
)
------------------
INSERT INTO Orders VALUES
(1,101, 'Test Order 1'),
(2,151, 'Random Order')
------------------
CREATE OR REPLACE FUNCTION get_orders (p_customerid int)
RETURNS TABLE (
id integer,
customerid INTEGER,
description varchar(100)
)
AS $$
BEGIN
RETURN QUERY SELECT
*
FROM
orders ord
WHERE
ord.customerid = p_customerid;
END; $$
LANGUAGE 'plpgsql';
SQL与其他编程语言不同:
它没有执行顺序的概念,因此先设置变量然后使用它的想法与 SQL 格格不入。
SQL 首先没有“变量”的概念。
在 SQL 中,“程序”是一条语句。
因此,SQL 在变量和过程编程方面缺乏。 补救措施是在像 PL/pgSQL 这样的过程语言中使用 function。 然后您可以使用变量,您可以将 output 作为 function 结果返回。
DO
语句无法返回结果。
借助此: 如何在 PostgreSQL 查询中声明变量。
我猜DO
语句不能返回结果。 以下是替代方案:
DO $$
declare customerid integer := 151;
BEGIN
CREATE TEMP TABLE tmp_orders ON COMMIT DROP AS
SELECT * FROM get_orders(customerid);
END $$;
SELECT * FROM tmp_orders;
-----------------------------
PREPARE temp(int) AS
SELECT * FROM get_orders($1);
EXECUTE temp(151)
-----------------------------
WITH
custid AS (VALUES (151))
SELECT * FROM get_orders((table custid))
-- DBeaver Only
@set custid = 151
SELECT * FROM get_orders(${custid});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.