Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在Postgres函数中访问返回表_Sql Server_Postgresql_Function_Plpgsql - Fatal编程技术网

Sql server 在Postgres函数中访问返回表

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

在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 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)
甚至不用定义函数就可以完成这项工作。