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

时间:2012-01-11 14:16:38

标签: sql oracle postgresql insert compatibility

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

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

上面的陈述有什么好处,我可以在任何DML语句之前添加'returns *',而不知道它执行的表的结构甚至名称,只是得到所有行,就像它是一个select语句。

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

因此,问题是是否有一个oracle语句(或语句序列)来模拟PostgreSQL'return *'而不用硬编码表或列名。换句话说,有没有办法编写这样的Oracle函数:

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

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

更新: 我实际上找到了a very similar question(用于从SQL服务器而不是PostgreSQL到Oracle的转换)。不过,如果可能的话,我很想听到一个更简单的答案。

2 个答案:

答案 0 :(得分:4)

我可以想象一个涉及EXECUTE IMMEDIATE, RETURNINGREF CURSOR的解决方案,但显然它远非简单。我之前已经找到了诸如this one, involving XML之类的解决方案来解决使用任意类型记录的问题。至少可以说,它们非常怪异。我猜你不得不求助于运行两个单独的查询...具体来说,使用Oracle 8i,我恐怕你甚至无法从大多数功能中获利。

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

答案 1 :(得分:3)

目前还不可能,特别是在旧版本的Oracle中,例如8i。请参阅此answer以查找类似的问题。