打印DO匿名块的执行输出

问题描述 投票:7回答:2

我在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
2个回答
7
投票

使用RAISE NOTICE语句

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

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


4
投票

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

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声明。

© www.soinside.com 2019 - 2024. All rights reserved.