将MSSQL解决方案转换为Oracle

时间:2014-05-14 16:49:10

标签: sql-server oracle plsql cursor temp-tables

我有一个特别紧迫的问题;我在MSSQL中有一套存储过程,不能直接转换为Oracle。我做了一个很好的尝试,但我认为我的范例在甲骨文中的工作方式与MSSQL相同 - 而且它是一个基本的东西。

在MSSQL中,我:

  • 创建一个临时表(我不知道设计时的结构,只是运行时 - 我从另一个表创建临时表) 将记录插入临时表

  • 然后,运行一组动态确定的存储过程(来自数据库中的数据),用于优化数据(即删除不符合条件的行),从临时表

    < / LI>
  • 然后,从临时表中返回记录。

在MSSQL中可以正常工作(此刻,直到我可以优化整个图层)。但是,在oracle中,我们尝试了同样的事情。由于Oracle没有相同的临时表范例,我最终创建了一个表,然后在事务结束时删除它。我真正想做的是弄清楚如何使它像MSSQL一样表现。

我想也许我可以像MSSQL临时表一样使用游标,但是我不知道如何从游标中删除记录而不删除数据库中的记录 - 至少,&#39;我每次查找时都会删除游标。

实施例

(适用MSSQL)

SELECT 
  objectid, typeid, field1, field2, field3, field4
INTO
  #temptable
FROM
  objecttable

EXEC FilterRecordsSuite #temptable

SELECT * FROM #temptable

(适用ORACLE)

BEGIN
  EXECUTE IMMEDIATE 
      'CREATE TABLE mytemptable_<uniquevalue> AS 
       SELECT 
         objectid, typeid, field1, field2, field3, field4
       FROM
         objecttable
      ';

  COMMIT;

  FilterRecordsSuite mytemptable_<uniquevalue>

  OPEN :some_ref_cursor FOR
      'SELECT * FROM mytemptable_<uniquevalue>';

  EXECUTE IMMEDIATE 'DROP TABLE mytemptable_<uniquevalue>'

这不是我的代码,这是古老而可怕的。我只是想让它发挥作用,直到我能将整个事物重构成可理解的东西。不幸的是,我对Oracle的经验很少,而且保持应用程序正常运行,甚至性能稍微好的直接要求超过了我的重构能力。

有什么想法吗?

0 个答案:

没有答案