是否可以使用变量而不在postgreSQL中指定返回类型?

时间:2015-12-07 20:41:33

标签: postgresql plpgsql

考虑这个T-SQL:

DECLARE @ColorID INT
SET @ColorID = 3

SELECT *, left(name,3) 
FROM Products p
WHERE ColorID = @ColorID

这有效,但没有声明变量:

SELECT *, substring(name,1,3) 
FROM Products p
WHERE ColorID = 3

我试过了:

DO $$
DECLARE ColorID INT;
BEGIN
    ColorID := 3;

    SELECT *, substring(name,1,3) 
    FROM Products p
    WHERE ColorID = ColorID 
END$$;

它要我指定结果集。我不想这样做,因为它不断改变,因为我只是在探索数据。

ERROR:  query has no destination for result data

我试过"返回查询"但后来得到这个错误:

ERROR:  cannot use RETURN QUERY in a non-SETOF function

所以我想返回多行而不指定结果集应该是什么样子。使用PostgreSQL 9.4.4

1 个答案:

答案 0 :(得分:4)

匿名代码块(DO command)无法返回行,Postgres没有全局变量。 没有它,生活的方式很少。其中四个如下。

使用公用表表达式(WITH command

Array(
  ((1001-150329-002-0-04624,5060567),0),
  ((1002-141105-008-0-01934,10145500),0),
  ((1013-150324-009-0-02270,15750046),0),
  ((1005-150814-005-0-05885,5060656),1)),
  ((1009-150318-004-0-02537,5060583),0))

为变量使用临时表:

WITH def AS (
    SELECT 3 AS colorid
    )
SELECT *, substring(name,1,3) 
FROM products
JOIN def
USING (colorid);

使用临时表获取结果:

CREATE TEMP TABLE var(colorid int);
INSERT INTO var values (3);
SELECT *, substring(name,1,3) 
FROM products
JOIN var
USING (colorid);
DROP TABLE var;

创建一个函数(示例):

DO $$
DECLARE v_colorid INT;
BEGIN
    v_colorid := 3;
    CREATE TEMP TABLE res AS 
        SELECT *, substring(name,1,3) 
        FROM products
        WHERE colorid = v_colorid;
END $$;
SELECT * 
FROM res;
DROP TABLE res;