我写了一个函数,输出一个SELECT以文本形式组成的PostgreSQL 查询.现在我不想再输出文本,但实际上SELECT对数据库运行生成的语句并返回结果 - 就像查询本身一样.
CREATE OR REPLACE FUNCTION data_of(integer)
RETURNS text AS
$BODY$
DECLARE
sensors varchar(100); -- holds list of column names
type varchar(100); -- holds name of table
result text; -- holds SQL query
-- declare more variables
BEGIN
-- do some crazy stuff
result := 'SELECT\r\nDatahora,' || sensors ||
'\r\n\r\nFROM\r\n' || type ||
'\r\n\r\nWHERE\r\id=' || $1 ||'\r\n\r\nORDER BY Datahora;';
RETURN result;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION data_of(integer) OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)
sensors …
众所周知,您无法SELECT在Oracle或SQL Server(可能是大多数其他主流RDBMS产品)中执行存储过程.
一般来说,从存储过程中选择有几个明显的"问题",只有两个想到:
a)存储过程产生的列是不确定的(直到运行时才知道)
b)由于存储过程的不确定性,构建数据库统计信息和制定有效的查询计划会出现问题
由于用户经常需要此功能,因此随着时间的推移已经开发了许多变通方法:
http://www.club-oracle.com/threads/select-from-stored-procedure-results.3147/
http://www.sommarskog.se/share_data.html
SQL Server特别具有OPENROWSET允许您加入或选择几乎任何内容的功能:https: //msdn.microsoft.com/en-us/library/ms190312.aspx
....但是,出于安全原因,DBA倾向于非常不愿意这样做.
所以我的问题是:虽然允许连接到存储过程或从存储过程中选择涉及一些明显的问题或性能考虑因素,但是为什么RDBMS平台不支持此功能存在一些基本的潜在技术原因?
编辑:
从初始反馈中得到更多澄清....是的,您可以从存储过程返回结果集,是的,如果要加入,可以使用(表值)函数而不是存储过程(或从选择)中的结果-然而,这是不一样的东西作为JoiningTo/SelectingFrom的存储过程.如果您在完全控制的数据库中工作,则可以选择使用TVF.但是,您发现自己在第三方数据库中工作并且被迫调用预先存在的存储过程是非常常见的.或者,您经常希望加入系统存储过程,例如:sp_execute_external_script(https://msdn.microsoft.com/en-us/library/mt604368.aspx).
编辑2:
关于PostgreSQL是否可以做到这一点的问题,答案也是否定的: PostgreSQL可以在两个SQL Server存储过程之间执行连接吗?