4

问题:

在 Microsoft SQL Server 中,有存储过程,也有表值函数。

不同之处在于,从存储过程中,我不能做进一步的选择,而从表值函数中,我可以。

例如

SELECT * FROM sp_whatever WHERE xxx是非法的
,而
SELECT * FROM TVF_whatever WHERE xxx完全合法

现在我的问题:

在 PostgreSQL 中,当我查看时information_schema.routines,如何区分表值函数和过程?

有区别吗?

一般来说,我如何区分 PostgreSQL 中的函数和过程?

我的意思是理论上,在 SQL 服务器上,可以像这样区分它们:
表值函数:information_schema.data_type = 'table'
存储过程:information_schema.data_type IS NULL
函数:information_schema.data_type != 'table' AND information_schema.data_type IS NOT NULL

这是如何在 Postgres 中完成的?

理论上,存储过程的返回类型为 void,但由于存储过程也可以返回表,因此无法区分 tvf 和存储过程 - 假设存在差异

所以我的问题也可以表述为:
在 PostGreSQL 中,如何创建表值函数,以及如何创建存储过程(每个示例 1 个)。

我对两者之间的返回类型的差异感兴趣(如果有的话)。

4

1 回答 1

3

PostgreSQL 没有真正的存储过程,只有用户定义的函数:

CREATE FUNCTION foo() RETURNS TABLE(bar INT, baz TEXT) ...

CREATE FUNCTION bar() RETURNS BOOLEAN ...

检查数据类型“记录”:

SELECT * FROM information_schema.routines WHERE data_type = 'record';
于 2012-09-07T06:23:17.380 回答