簡體   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