gpt4 book ai didi

sql - Oracle 相当于 PostgreSQL INSERT...RETURNING *;

转载 作者:行者123 更新时间:2023-11-29 11:19:37 25 4
gpt4 key购买 nike

我已经将一堆 DML(INSERT/UPDATE/DELETE)查询从 Oracle 转换到 PostgreSQL,现在我需要检查它们是否产生相同的行集,即 delete 删除相同的行,假设 oracle 和postgresql 数据库最初包含相同的数据,更新更新相同的行等。在 PostgreSQL 方面,我可以将 returning 子句与 DML 语句一起使用,即

INSERT INTO test(id, name) VALUES(42, 'foo') RETURNING *;

上面语句的优点在于,我可以在任何 DML 语句前添加“returning *”,而无需了解其执行所针对的表的结构或名称,并且只获取所有行,就像它是一个 select 语句一样。

不过在Oracle这边好像没有那么 Shiny 。根据文档,Oracle 8i(我正在使用的)支持 RETURNING 子句,但它必须将结果存储到变量中,而且似乎没有明显的方法来获取所有结果列而不是手动指定列名。

因此,问题是是否存在一个 oracle 语句(或语句序列)来模拟 PostgreSQL“返回 *”而无需对表名或列名进行硬编码。换句话说,有没有办法像这样编写 Oracle 函数:

fn('INSERT INTO test(id, name) VALUES(42, ''foo'')') 

它应该返回由 SQL 语句插入(或在一般情况下修改)的行集。

更新:我居然找到了a very similar question (用于从 SQL Server 而非 PostgreSQL 到 Oracle 的转换)。尽管如此,如果可能的话,我还是希望听到一个更简单的答案。

最佳答案

我可以想象一个涉及 EXECUTE IMMEDIATE, RETURNING 的解决方案, 和 REF CURSOR ,但显然这远非简单。我以前找到过解决方案,例如 this one, involving XML解决使用任意类型记录的问题。至少可以说,他们非常怪异。我想您将不得不求助于运行两个单独的查询...具体来说,使用 Oracle 8i,恐怕您甚至无法从其中的大部分功能中获益。

简而言之,我认为没有任何 SQL 结构像 Oracle 中的 Postgres ... RETURNING 子句一样强大。

关于sql - Oracle 相当于 PostgreSQL INSERT...RETURNING *;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8820789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com