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