此问题与之前的问题有关:Why is selecting from stored procedure not supported in relational databases?
在SQL Server上,您无法对存储过程执行连接(或从中选择)(请注意:存储过程与函数明显不同(表) SQL Server术语中的值 - 使用函数,您知道在设计时返回的列,但是使用过程,要返回的特定列在运行时才会知道。
对于SQL Server,确实存在“DBA通常不允许”的方法,可以实现这样的连接:OPENROWSET
所以问题是:
PostgreSQL可以在两个程序之间执行连接,直到运行时才知道这些列吗?
除了使用驻留在外部第三方数据库中的存储过程(可能通过外部数据包装器或其他某种机制)之外,它是否可以这样做?
答案 0 :(得分:5)
- PostgreSQL可以在两个〜程序之间执行连接 列直到运行时才知道?
醇>
基本答案很简单,因为 目前在Postgres中没有存储过程 (直到Postgres 10),只是函数 - 提供几乎但不完全相同的功能,正如你在问题中所阐述的那样。
任何函数都可以在Program
查询的GetType
子句中使用,就像任何其他表一样。
更新:
Postgres 11引入了SQL程序("存储过程")
CREATE PROCEDURE
的手册。
SQL本身要求在运行时知道返回类型。有一个 border-case :您可以使用polymorphic types使用函数调用声明返回类型。这里的详细说明(最后一章与您最相关):
- 除了使用驻留的存储过程外,它可以执行相同的操作 外部第三方数据库(可能通过外部数据包装或 其他一些机制)?
醇>
基于同样的原则, NO 也是如此。如果您使用foreign tables,则必须以一种或另一种方式提供明确定义的返回类型。
你可能能够将SQL-Server-stored-procedure产生的整行整合到一个制表符分隔的文本表示中,但是(除了容易出错且效率低下)之外有一个列,需要元信息定义单个列的一种或另一种方式来提取列 - catch 22。