【问题标题】:How to use DO in postgres如何在 postgres 中使用 DO
【发布时间】:2018-08-15 15:58:51
【问题描述】:

我正在尝试更好地理解 postgreSQL 9.1 中的 DO 命令

我有以下代码块,

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 行

【问题讨论】:

  • 如果不将SELECT 的结果放在某处或对其进行处理,您将无法在DO 块中执行SELECTDO 块中的 SELECT 'foo' 不会在屏幕上显示“foo”。数据通过RAISE NOTICE等显示。如果要选择某些内容并丢弃结果,请使用PERFORMPERFORM 'foo'

标签: postgresql


【解决方案1】:

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

您的示例有多个问题:

  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 documentation 以更好地了解这项技术。

【讨论】:

    猜你喜欢
    • 2020-02-24
    • 2015-05-13
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多