我在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
。
如何将整个代码块输出到控制台?
答案 0 :(得分:7)
使用RAISE NOTICE语句
postgres=# DO $$BEGIN RAISE NOTICE 'Hello %', SESSION_USER; END; $$;
NOTICE: Hello pavel
DO
在相关documentation中查看更多内容。
答案 1 :(得分: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
语句。