【问题标题】:Postgres SQL - Output Clause into a scalar variablePostgresql - 将子句输出到标量变量
【发布时间】:2020-03-25 15:13:38
【问题描述】:

对于下面的需要将 SQL server 中的代码转换为 PostgresSQL。我确实尝试了与 SQL Server 中相同的方法,但它确实有效。

declare @ID table (ID int)

insert into MyTable(ID)
output inserted.ID into @ID
values (1)

所以上面的代码在 SQL Server 中运行良好,但在 Postgres 中它不起作用。

有人可以帮助将此代码转换为 Postgres 吗?也有人可以帮助我获得 Postgres 中带有 inout 和 out 参数的示例 SP

【问题讨论】:

  • "Postgres 中带有 inout 和 out 参数的示例 SP" 不要在过程中使用 OUT 参数来返回某些内容。如果要返回某些内容,请使用函数。您需要接受 SQL Server 与 Postgres(或基本上任何其他 DBMS)非常不同Migrate your mindset too

标签: postgresql stored-procedures


【解决方案1】:

假设这个用 PL/pgSQL 编写的存储函数(或过程)的一部分,您可以使用返回子句as documented in the manual

....
declare
  l_generated_id int;
begin
  ...
  insert into my_table(id) 
  values (1)
  returning id into l_generated_id;
  ...
end;

但我不得不承认这似乎是不必要的,因为插入的值是硬编码在 INSERT 语句中的

【讨论】:

  • 仅供参考:不同之处在于 MsSql“输出”子句可以产生多行,而不仅仅是一行,并且可以在存储过程/函数之外使用(正如您的文档链接所建议的那样)。在 MsSql 中,“输出”子句可以在 INSERT 和 UPDATE 中使用,如果需要,可以同时捕获“之前”和“之后”值。
  • @Granger:Postgres 中的 returning 子句在 SQL(而不是 PL/pgSQL)中使用时完全相同:dbfiddle.uk/… 但变量只能用于过程代码(例如 PL/pgSQL ) 这就是问题所在。
  • 我正在关闭您提供的文档链接。 :) 无论如何,我很高兴它具有相同的功能。
  • @Granger:手册的链接指的是 PL/pgSQL——而不是 SQL。 Postgres - 基本上与除 SQL Server 之外的所有其他数据库一样 - 明确区分了查询语言 (SQL) 和过程语言 (PL/xxx)
  • 感谢您的认可。 (您通过引入 PL/pgSQL 使您的答案变得不那么有用,因为现在很明显不需要它。)
猜你喜欢
  • 2011-07-30
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2011-05-29
相关资源
最近更新 更多