首页 > 解决方案 > 如何在 postgres 中使用 DO

问题描述

我试图更好地理解DOpostgreSQL 9.1 中的命令

我有以下代码块,

DO
$do$
BEGIN
IF 1=1 THEN
SELECT 'foo';
ELSE
SELECT 'bar';
END IF;
END
$do$

但是它返回以下错误:

[42601] 错误:查询没有结果数据的目的地 提示:如果要丢弃 SELECT 的结果,请改用 PERFORM。其中:SQL 语句中的 PL/pgSQL 函数“inline_code_block”第 4 行

标签: postgresql

解决方案


PostgreSQLDO命令创建并执行一些特定的短寿命函数。此函数没有任何接口,因此除了更改表中的数据和一些调试输出之外,它无法返回任何输出。

您的示例有多个问题:

  1. 只有 PostgreSQL 表函数可以返回一些表格数据。但该机制与 MSSQL 有很大不同。PostgreSQL 用户应该使用RETURN NEXTRETURN QUERY命令。

    CREATE OR REPLACE FUNCTION foo(a int)
    RETURNS TABLE(b int, c int) AS $$
    BEGIN
      RETURN QUERY SELECT i, i + 1 FROM generate_series(1,a) g(i);
    END;
    $$ LANGUAGE plpgsql;
    
    SELECT * FROM foo(10);
    
  2. DO匿名函数不是表函数 - 因此不允许输出。

  3. PostgreSQL 9.1 不支持版本,请升级

如果你只有 MSSQL 的一些经验,那就忘了它。PostgreSQL 的存储过程概念与 Oracle 或 DB2 非常相似,与 MSSQL 有很大不同。T-SQL 将过程和 SQL 构造集成到一组中。Oracle, PostgreSQL, ... 过程功能可以嵌入 SQL,但过程功能没有集成到 SQL。

请阅读 PostgreSQL PLpgSQL文档以更好地了解这项技术。


推荐阅读