繁体   English   中英

Postgres - 如何使用变量调用 function 并从 DBeaver/pgAdmin 返回表/行集

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM