PostgreSQL:如何区分存储过程和表值函数?

时间:2012-09-07 05:40:42

标签: sql postgresql postgresql-9.1 information-schema

问题:

在Microsoft SQL Server中,存在过程,并且存在表值函数。

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

e.g。

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和存储的precedure - 假设 存在差异。< / p>

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

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

1 个答案:

答案 0 :(得分:3)

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

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

CREATE FUNCTION bar() RETURNS BOOLEAN ...

检查数据类型“record”:

SELECT * FROM information_schema.routines WHERE data_type = 'record';