PostgreSQL不像Oracle这样的数据库支持存储过程 ,但是它确实支持存储函数 。 在本文中,我将介绍一些可以使PostgreSQL中使用存储函数(存储函数及其调用代码均用PL / pgSQL编写)的策略,就像使用存储过程一样 。 这些简单的方法允许开发人员以与存储过程的使用更加一致的方式使用PostgreSQL存储函数。

存储过程和存储函数非常相似,实际上,我经常听到术语“存储过程”可互换地用于存储过程和存储函数。 出于本文的目的,两者之间的本质区别可以归纳为:

  1. 使用FUNCTION关键字创建函数,并使用PROCEDURE关键字创建过程。
  • 存储的函数的返回值可以在SELECT语句中使用。

因为PostgreSQL PL / pgSQL仅支持存储的函数,所以定义的函数需要声明一个返回类型。 幸运的是,对于我们模拟的“ 存储过程 ”,我们可以将void声明为返回类型 。 下面的代码清单中以PL / pgSQL编写的“ Hello World”实现对此进行了演示。

CREATE OR REPLACE FUNCTION helloWorld(name text) RETURNS void AS $helloWorld$
DECLARE
BEGIN
    RAISE LOG 'Hello, %', name;
END;
$helloWorld$ LANGUAGE plpgsql;

编写了带有void返回类型的PostgreSQL存储函数后,我们现在可以从客户端调用它了。 在这种情况下,我将研究三种从其他PL / pgSQL代码调用存储函数的方法。

PL / pgSQL:通过SELECT语句调用函数

调用PL / pgSQL代码中的存储函数的一种方法是使用SELECT INTO 。 最明显的缺点是,在类似过程的函数返回void的情况下,没有选择任何有用的东西,因此无论如何都必须忽略选择到其中的变量。 下一个代码清单演示了如何使用SELECT INTO调用类似于过程的函数。 在此示例中,称为“ dumped”的变量不会选择任何有用的东西,但是该语句成功调用了存储的函数。 除了此处显示的行之外,DECLARE部分中还需要一行来声明“ dumped”变量。

SELECT INTO dumped helloWorld('Dustin');

PL / pgSQL:通过变量分配调用函数

PL / pgSQL 赋值运算符提供了另一种方式来调用类似于过程的存储函数。 与前面的示例一样,此方法要求在DECLARE节中声明一个变量(“忽略”),然后为该变量分配返回void的函数的结果,从而也有效地将其丢弃。

ignored := helloWorld('Dustin');

PL / pgSQL:使用PERFORM显式忽略返回值

当调用类似过程的存储函数时,PL / pgSQL命令PERFORM提供了一些语法上的优势。 该命令不需要声明PL / pgSQL变量。 这节省了声明变量的行,并且避免了设置从未真正设置过的变量的伪装。 它实际上只是SELECT的快捷方式,但是它在语法上更甜美,并且使代码更具可读性,因为代码维护人员不必弄清楚似乎在进行赋值的语句实际上就不会这样做。

PERFORM helloWorld('Dustin');

结论

尽管PostgreSQL仅支持存储的“函数”(而非存储的“过程”),但它提供的语法使函数具有类似过程的性质。 通过允许存储的函数返回void并通过不希望有结果值的PERFORM从PL / pgSQL代码中调用,PostgreSQL允许客户端代码看起来像是在调用存储过程而不是存储函数。

翻译自: https://www.javacodegeeks.com/2015/08/procedure-like-functions-in-postgresql-plpgsql.html