2012-01-11 64 views
8

我已经将一堆DML(INSERT/UPDATE/DELETE)查询从Oracle转换为PostgreSQL,现在我需要检查它们是否生成相同的一组行,即删除相同的行,假定使用oracle和postgresql数据库包含相同的数据开始,更新更新相同的行等在PostgreSQL的一面,我可以用用DML语句返回条款,即Oracle相当于PostgreSQL INSERT ... RETURNING *;

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

什么好的上述声明的是,我可以在前面加上“返回* '到任何DML语句而不知道结构,甚至不知道它执行的表的名称,只是得到所有的行,比如它是一个select语句。

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

因此,问题是如果有一个oracle语句(或语句序列)来模拟PostgreSQL的'返回*'而没有硬编码表或列名称。换句话说,有没有写这样一个Oracle功能的方法:

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

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

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

+0

你是从Java调用这个SQL吗? – 2012-01-11 14:22:32

+0

不,实际上我是从一个python脚本调用它们,因此,编写per-statement返回colname,1 colname2需要解析原始语句并提取列和表名,这不是我喜欢做的这样一个小任务。 – alexk 2012-01-11 14:33:21

+0

你为什么使用一个不支持和停止使用的Oracle版本? – 2012-01-11 15:09:15

回答

3

目前不可能,尤其是在Oracle的旧版本(如8i)中。看到这个answer类似的问题。

4

我可以想象一个涉及EXECUTE IMMEDIATE, RETURNINGREF CURSOR的解决方案,但显然它不会很简单。我以前发现如this one, involving XML这样的解决方案存在任何类型的记录将被使用的问题。至少可以说,他们很怪异。我想你不得不求助于运行两个单独的查询......具体来说,对于Oracle 8i,恐怕你甚至不能从大多数这些功能中获利。

总之,我不认为有任何SQL构造像Oracle中的Postgres ... RETURNING子句那样强大。