在SQL Server中,我可以通过SQL Server Management Studio或任何其他客户端执行带有完整过程逻辑的即席T-SQL代码。我已经开始使用PostgreSQL并遇到了一些差异,因为PGSQL要求任何逻辑都必须嵌入函数中。
有没有一种方法可以在不创建和执行函数的情况下执行PL/PGSQL代码?
在SQL Server中,我可以通过SQL Server Management Studio或任何其他客户端执行带有完整过程逻辑的即席T-SQL代码。我已经开始使用PostgreSQL并遇到了一些差异,因为PGSQL要求任何逻辑都必须嵌入函数中。
有没有一种方法可以在不创建和执行函数的情况下执行PL/PGSQL代码?
DO $$
-- declare
BEGIN
/* pl/pgsql here */
END $$;
不,目前还没有。版本9.0(仍处于Alpha测试阶段)将具备此选项(do),你必须等待其发布。
DO
v9.6文档:https://www.postgresql.org/docs/9.6/static/sql-do.html - Davos我曾经为了让它正常工作而苦苦挣扎,因为它对于在恰当的位置添加分号非常严格。但是一旦你习惯了这一点,它就能很好地工作。当然,除了无法返回记录之外,你还可以提出通知和异常,并使用像@ErwinBrandstetter在上面的评论中指出的临时表等其他解决方法。
e.g.:
DO
$$
BEGIN
IF EXISTS(SELECT 'any rows?'
FROM {your_table}
WHERE {your_column} = 'blah')
THEN
RAISE NOTICE 'record exists';
ELSE
RAISE EXCEPTION 'record does not exist';
END IF;
DROP TABLE IF EXISTS foo;
CREATE TEMP TABLE foo AS
SELECT 'bar'::character varying(5) as baz;
END
$$;
SELECT * FROM foo;
ERROR: query has no destination for result data
的错误提示。 - isapirDO
语句中返回任何内容。你可以通过引发通知、写入临时表或打开游标等可能的解决方法来实现。 - Erwin Brandstetter$$DECLARE
而不是$$
时,只需要做一点小的更改工作。DO $$DECLARE srno integer; BEGIN select into srno count(reg_count) from table_name where condition; raise notice 'Desired Count %', srno; END $$;
- Er. Amit Joshi