【问题标题】:Print the output of execution of DO anonymous block打印 DO 匿名块的执行输出
【发布时间】:2014-09-24 10:07:06
【问题描述】:

我在 Postgres 数据库中有一个匿名 DO 块,如下所示:

DO LANGUAGE plpgsql $$ 
DECLARE
     FUNC_ID smallint;
BEGIN
    SELECT COUNT(1) INTO FUNC_ID FROM FUNCTION WHERE NAME = 'addition';
    IF FUNC_ID = 0 THEN 
       INSERT INTO FUNCTION ( ID, NAME, DESCRIPTION, FUNCTION)
       values ((select (max(id)+1) from FUNCTION), 'subtraction'
              , 'calculate', 'catalog');
    END IF;

END;
$$;

如果执行这个代码块,它只会输出DO

如何将整个代码块输出到控制台?

【问题讨论】:

  • 定义“输出”。添加您希望获得的示例。

标签: postgresql plpgsql


【解决方案1】:

使用 RAISE NOTICE 语句

postgres=# DO $$BEGIN RAISE NOTICE 'Hello %', SESSION_USER; END; $$;
NOTICE:  Hello pavel
DO

在相关documentation中查看更多信息。

【讨论】:

    【解决方案2】:

    您的代码以多种方式扭曲。改为使用:

    DO
    $do$
    BEGIN
       IF EXISTS (SELECT 1 FROM function WHERE name = 'addition') THEN
          INSERT INTO function(id, name, description, function)
          SELECT max(id) + 1, 'subtraction', 'calculate', 'catalog'
          FROM   function;
    
          RAISE NOTICE 'Whatever'; -- see Pavel's answer
       END IF;
    END
    $do$;
    

    您可能应该有一个serial 主键,从SEQUENCE 中提取下一个值。你所拥有的很容易出现竞争条件和典型的反模式。

    即使 Postgres 允许,我也不会使用 function 作为标识符。这是reserved word in the SQL standard

    CREATE TABLE func
       func_id serial PRIMARY KEY
     , func text NOT NULL
     , description text
     , find_proper_name text)
    );
    

    那么你的整个陈述可以是:

    INSERT INTO func(func, description, find_proper_name)
    SELECT 'subtraction', 'calculate', 'catalog'
    WHERE  EXISTS (SELECT 1 FROM func WHERE func = 'addition');
    

    这里根本不需要DO 声明

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多