这个问题与前面的一个问题有关:为什么关系数据库不支持从存储过程中进行选择?
在SQL Server上,您不能执行存储过程的联接(或从中选择)(请注意:存储过程与函数(SQL Server术语中的表值函数)明显不同-使用函数,您知道在设计时返回的列,但使用过程,要返回的特定列直到运行时才知道)。
对于SQL Server,确实存在一种"DBA通常不允许"的方法,可以在其中完成这样的联接:OPENROWSET
所以问题是:
-
PostgreSQL是否可以在运行时才知道列的两个过程之间执行联接?
-
除了使用驻留在外部第三方数据库中的存储过程(可能通过外部数据包装器或其他机制)之外,它还能做同样的事情吗?
- PostgreSQL是否可以在直到运行时才知道列
基本答案很简单,因为目前Postgres中没有存储过程(最多Postgres 10),只有函数-它们提供了几乎但不完全相同的功能,正如您在问题中所阐述的那样。
任何函数都可以像任何其他表一样在SELECT
查询的FROM
子句中使用。
更新:
SQL过程("存储过程")是在Postgres 11中引入的。CREATE PROCEDURE
SQL本身要求在运行时知道返回类型。有一个边界大小写:您可以使用多态类型通过函数调用声明返回类型。此处的详细说明(最后一章与您最相关):
- 重构PL/pgSQL函数以返回各种SELECT查询的输出
- 除了使用驻留在外部第三方数据库(可能通过外部数据包装器或其他机制)
基于同样的原理,这也是一个NO。如果使用外部表,则必须以某种方式提供明确定义的返回类型。
您可能能够将SQL Server存储过程产生的整行集中到一个单独的制表符分隔的文本表示中,但是(除了容易出错和效率低下之外)您只有一列,并且需要定义单独列的元信息来提取列-catch 22。