1

这个问题与之前的一个问题有关:为什么关系数据库不支持从存储过程中选择?

在 SQL Server 上,您无法对存储过程执行连接(或从中选择)(请注意:存储过程与函数(SQL Server 术语中的表值函数)明显不同- 使用函数,您知道列在设计时返回,但通过过程,要返回的特定列直到运行时才知道)。

对于 SQL Server,确实存在一种“DBA 通常不允许”的方法,可以在其中完成这样的连接:OPENROWSET

所以问题是:

  1. PostgreSQL 可以在运行时才知道列的两个过程之间执行连接吗?

  2. 除了使用位于外部 3rd 方数据库中的存储过程(可能通过外部数据包装器或其他一些机制)之外,它可以做同样的事情吗?

4

1 回答 1

5
  1. PostgreSQL 可以在两个 ~procedures 之间执行连接,其中列直到运行时才知道?

基本答案很简单,因为Postgres中目前没有存储过程(直到 Postgres 10),只有函数 - 正如您在问题中所述,它们提供几乎但不完全相同的功能。

并且任何函数都可以像任何其他表一样在查询的FROM子句中使用。SELECT

更新:
SQL 过程(“存储过程”)是在 Postgres 11 中引入
CREATE PROCEDURE。 .

SQL 本身要求在运行时知道返回类型。有一个边界情况:您可以使用多态类型在函数调用中声明返回类型。此处的详细说明(最后一章与您最相关):

  1. 除了使用位于外部 3rd 方数据库中的存储过程(可能通过外部数据包装器或其他一些机制)之外,它可以做同样的事情吗?

这也是一个NO,基于相同的原则。如果您使用外表,则必须以一种或另一种方式提供明确定义的返回类型。

可能能够将 SQL-Server 存储过程产生的整行集中到单个制表符分隔的文本表示中,但是(除了容易出错和效率低下)您只有一个列并且需要定义元信息单个列以一种或另一种方式提取列-catch 22。

于 2015-11-24T14:32:38.493 回答