Sql server 在Postgres函数中访问返回表
在MSSQL中,当在多语句表值函数中时,可以与表交互,如下所示Sql server 在Postgres函数中访问返回表,sql-server,postgresql,function,plpgsql,Sql Server,Postgresql,Function,Plpgsql,在MSSQL中,当在多语句表值函数中时,可以与表交互,如下所示 CREATE FUNCTION dbo.test_func() RETURNS @table TABLE(id INT) AS BEGIN INSERT INTO @table(id) SELECT 1 UNION SELECT 2 UNION SELECT 3 UPDATE @table SET id = -1 WHERE id = 3 RETURN END GO CREATE FUNCTION
CREATE FUNCTION dbo.test_func() RETURNS @table TABLE(id INT) AS
BEGIN
INSERT INTO @table(id)
SELECT 1 UNION SELECT 2 UNION SELECT 3
UPDATE @table SET id = -1 WHERE id = 3
RETURN
END
GO
CREATE FUNCTION test_func() RETURNS TABLE(id int) AS $$
BEGIN
return QUERY SELECT 1 UNION SELECT 2 UNION SELECT 3;
UPDATE ???? SET id = -1 WHERE id = 3;
END;
$$ LANGUAGE plpgsql STABLE;
有没有办法在9.5级深造中做到这一点?我不确定要更新什么,如下所示
CREATE FUNCTION dbo.test_func() RETURNS @table TABLE(id INT) AS
BEGIN
INSERT INTO @table(id)
SELECT 1 UNION SELECT 2 UNION SELECT 3
UPDATE @table SET id = -1 WHERE id = 3
RETURN
END
GO
CREATE FUNCTION test_func() RETURNS TABLE(id int) AS $$
BEGIN
return QUERY SELECT 1 UNION SELECT 2 UNION SELECT 3;
UPDATE ???? SET id = -1 WHERE id = 3;
END;
$$ LANGUAGE plpgsql STABLE;
在函数的结果集与一起发送后,不能更改它 但是在PostgreSQL中,您不必在一条语句中发送整个结果集(这就是为什么在PostgreSQL中,您所要求的没有什么意义)。您可以使用
RETURN NEXT
将行逐行发送到结果集,也可以使用RETURN QUERY
/RETURN QUERY EXECUTE
将结果集的块发送到结果集,或者您甚至可以混合使用。(您也可以使用一个不带参数的返回退出该函数)
所以,你可能想做的是:
CREATE FUNCTION test_func() RETURNS TABLE(id int) AS $$
BEGIN
RETURN QUERY VALUES (1), (2);
-- do some calculation
RETURN NEXT -1;
END;
$$ LANGUAGE plpgsql STABLE;
如果您真的想模拟,可以使用临时表,或者(最好)在函数中使用子选择:
CREATE FUNCTION test_func() RETURNS TABLE(id int) AS $$
BEGIN
RETURN QUERY SELECT (SELECT CASE WHEN v = 3 THEN -1 ELSE v END res)
FROM (VALUES (1), (2), (3)) v;
END;
$$ LANGUAGE plpgsql STABLE;
它根本不需要PL/pgSQL。一个简单的SQL函数可以:
CREATE FUNCTION test_func()
RETURNS SETOF int AS
$func$
SELECT CASE WHEN v = 3 THEN -1 ELSE v END
FROM (VALUES (1), (2), (3)) v;
$func$ LANGUAGE sql IMMUTABLE;
还演示了简单情况下的简单形式SETOF int
,而不是TABLE(id int)
。你可以用任何一种
相关答案(除其他外):
对于更复杂的操作,可以使用
对于更复杂的工作,您可以使用实际的:
函数的具体功能是什么?@a_horse_,没有名称上面显示的函数在返回表中插入3个值,然后更新其中一个插入值,即值为3的值。基本上,我需要知道如何更新已经插入到returns表中的数据。我可以在Postgres中发布一个例子,如果这能更好地说明这一点的话。当用正确的表名替换无效的@table
标识符时,可以用相同的方式编写insert和update(实际上可以使用values
子句编写更短的insert)。但是单个返回的在最后做了什么?它返回什么?@a_horse_和_no_name它不返回任何东西,在MSSQL中编写这种类型的函数时需要它。我不确定您所说的“在替换无效的@表
标识符时可以以相同的方式写入”是什么意思。在博士后我会用什么来代替它?我知道INSERT会变成RETURN查询。@a_horse_和_no_name我编辑了我的问题,以包含一个Postgres示例,如果这有帮助的话。我知道我可以使用临时表,但如果可能的话,我会尽量避免使用,因为MSSQL中不需要临时表。听起来好像我不能。感谢您的澄清。第一个查询应该是VALUES(1)、(2)
,返回两行一列,而不是一行两列,这在本上下文中不起作用。所有这些都可以是不可变的,而不仅仅是稳定的。在第二个示例中,您不需要子查询。它可以是一个简单的SQL函数……是否可以访问已经插入的值?在第一个示例中,您对1和2执行返回查询
。有没有一种方法可以像在MSSQL中那样,通过从@表
中进行选择,使1和2返回?比利:没有,不是在同一个函数中。结果集一旦返回就无法访问,正如pozs所解释的(这里没有“插入”)。您可以从另一个函数调用该函数来更改结果行,但这通常不是必需的。或者,您可以使用实际的临时表来执行更复杂的操作,这些操作是在函数内部或外部创建的。@ErwinBrandstetter感谢您的澄清。是的,它应该是值(1)、(2)
。我故意留下了函数的签名,如问题中所示。我假设,这只是一个更复杂函数的简化版本。如果不是这样,一个简单的值(1)、(2),(-1)
甚至不用定义函数就可以完成这项工作。