2010-04-02 123 views
41

使用SQL Server,我可以通过SQL Server Management Studio或任何其他客户端使用完整的程序逻辑执行代码特设T-SQL代码。我已经开始使用PostgreSQL,并且遇到了一点不同,因为PGSQL需要将任何逻辑嵌入到函数中。如何在不创建函数的情况下执行pl/pgsql代码?

有没有办法执行PL/PGSQL代码而不创建执行功能?

回答

51

的Postgres 9

DO $$ 
-- declare 
BEGIN 
    /* pl/pgsql here */ 
END $$; 
+3

对于任何发现此答案并试图获得“错误:语法错误在“SELECT”或“SELECT”附近,你需要一个BEGIN和END。 DO $$ BEGIN/* pl/pgsql here */END $$ – 2013-08-26 02:31:38

+2

但是,该代码如何返回查询结果?如果我把一个SELECT放在pl/pgsql部分,我会得到'ERROR:查询没有结果数据的目的地' – isapir 2015-12-29 02:14:52

+2

@Igal:它不能。你不能从'DO'声明中返回任何东西。您可能会发出通知或写入临时表或打开游标作为可能的解决方法。 – 2016-04-29 02:23:37

5

不,还没有。 9.0版本(仍然是alpha)会有这个选项(做),你必须等到它被释放。

+0

+1,但我认为这是为8.5宣布 - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html – 2010-04-02 22:33:55

+1

我认为8.5成为9.0因为实施了一些主要功能... – 2010-04-02 22:37:50

+0

啊,这将解释它。 – 2010-04-02 22:38:20

1

我努力得到这个工作,因为它是相当严格的关于完全正确的地方加入半冒号。但一旦你习惯了,它运作良好。当然,除了无法返回记录外,您还可以引发异常并发出通知&,并执行其他解决方法,如在上面的注释中指出的使用临时表作为@ErwinBrandstetter。

如:

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; 
+0

我认为能够返回行,类似于SQL Server/Oracle存储过程,正在进入PostgreSQL的下一个版本。为什么这样做已经超过了我。 – 2017-12-07 17:22:36

相关问题