这两天写数据库升级脚本,发现MSSQL和Oracle之间的转化还是比较容易的。

       以下面两个过程为例。两者的功能相似。

       1.MSSQL脚本

 1GO

      2.ORACLE脚本

 1Oracle与MSSQL过程之间的转化BEGIN
 2Oracle与MSSQL过程之间的转化DECLARE
 3Oracle与MSSQL过程之间的转化    tempPoTableName varchar2(50);        --性能对象表名
 4Oracle与MSSQL过程之间的转化    tempPoSpName varchar2(50);            --性能过程名
 5Oracle与MSSQL过程之间的转化    errorInfo varchar2(200);             --错误信息
 6Oracle与MSSQL过程之间的转化    tempSQL    varchar2(1000);
 7Oracle与MSSQL过程之间的转化    cnt1   number(1);
 8Oracle与MSSQL过程之间的转化    cnt2   number(2);
 9Oracle与MSSQL过程之间的转化    
10Oracle与MSSQL过程之间的转化    --定义表名、同步表名和存储过程游标
11Oracle与MSSQL过程之间的转化    Cursor allValues_Cursor is
12Oracle与MSSQL过程之间的转化         select UPPER(TRIM(POTABLENAME)),UPPER(TRIM(POSPNAME)) from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580;
13Oracle与MSSQL过程之间的转化             
14Oracle与MSSQL过程之间的转化BEGIN
15Oracle与MSSQL过程之间的转化    OPEN allValues_Cursor;
16Oracle与MSSQL过程之间的转化
17Oracle与MSSQL过程之间的转化    --判断是否由符合游标条件的行,如果没有则关闭和释放游标,异常返回
18Oracle与MSSQL过程之间的转化    
19Oracle与MSSQL过程之间的转化    DBMS_OUTPUT.PUT_LINE('开始更改原有表名……');
20Oracle与MSSQL过程之间的转化    FETCH  allValues_Cursor INTO tempPoTableName,tempPoSpName;
21Oracle与MSSQL过程之间的转化    --根据给定的表名、存储过程名 创建相应的数据存储存储过程
22Oracle与MSSQL过程之间的转化    WHILE allValues_Cursor%found LOOP
23Oracle与MSSQL过程之间的转化    
24Oracle与MSSQL过程之间的转化    cnt1:=0;
25Oracle与MSSQL过程之间的转化    cnt2:=0;
26Oracle与MSSQL过程之间的转化    BEGIN
27Oracle与MSSQL过程之间的转化        SELECT 1 INTO cnt1 FROM dual WHERE exists(SELECT table_name FROM user_tables WHERE table_name = tempPoTableName);
28Oracle与MSSQL过程之间的转化        SELECT 1 INTO cnt2 FROM dual WHERE exists(SELECT OBJECT_NAME FROM user_procedures WHERE OBJECT_NAME = tempPoSpName);
29Oracle与MSSQL过程之间的转化    exception
30Oracle与MSSQL过程之间的转化    WHEN no_data_found  THEN
31Oracle与MSSQL过程之间的转化        null;
32Oracle与MSSQL过程之间的转化    END;
33Oracle与MSSQL过程之间的转化    
34Oracle与MSSQL过程之间的转化    IF cnt1 = 1 THEN
35Oracle与MSSQL过程之间的转化        DBMS_OUTPUT.PUT_LINE(tempPoTableName);
36Oracle与MSSQL过程之间的转化        tempSQL := 'ALTER TABLE '||tempPoTableName||' DROP constraint PK_'||tempPoTableName;
37Oracle与MSSQL过程之间的转化        EXECUTE IMMEDIATE tempSQL;
38Oracle与MSSQL过程之间的转化        tempSQL := 'ALTER TABLE '||tempPoTableName||' RENAME TO '||tempPoTableName||'_TMP';
39Oracle与MSSQL过程之间的转化        EXECUTE IMMEDIATE tempSQL;
40Oracle与MSSQL过程之间的转化    ELSE
41Oracle与MSSQL过程之间的转化        DBMS_OUTPUT.PUT_LINE('没有找到表'||tempPoTableName);
42Oracle与MSSQL过程之间的转化    END IF;
43Oracle与MSSQL过程之间的转化    
44Oracle与MSSQL过程之间的转化    IF cnt2 = 1 THEN
45Oracle与MSSQL过程之间的转化        tempSQL := 'DROP PROCEDURE '||tempPoSpName;
46Oracle与MSSQL过程之间的转化        EXECUTE IMMEDIATE tempSQL;
47Oracle与MSSQL过程之间的转化    ELSE
48Oracle与MSSQL过程之间的转化        DBMS_OUTPUT.PUT_LINE('没有找到过程'||tempPoSpName);
49Oracle与MSSQL过程之间的转化    END IF;
50Oracle与MSSQL过程之间的转化    
51Oracle与MSSQL过程之间的转化        FETCH allValues_Cursor INTO tempPoTableName,tempPoSpName;
52Oracle与MSSQL过程之间的转化    END LOOP;
53Oracle与MSSQL过程之间的转化    CLOSE allValues_Cursor;
54Oracle与MSSQL过程之间的转化    DBMS_OUTPUT.PUT_LINE('结束更改原有表名……');
55Oracle与MSSQL过程之间的转化    DBMS_OUTPUT.PUT_LINE('------------------------');
56Oracle与MSSQL过程之间的转化    END;
57Oracle与MSSQL过程之间的转化END;
58Oracle与MSSQL过程之间的转化/


        上面两个是无名存储过程,不需要考虑是否已经存在该过程。对于有名的过程需要考虑对象是否已经存在。
        我是从MSSQL向Oracle转化的。
      第一步,修改整体结构。
      MSSQL的总体结构如下,只需要一个begin和end,中间加入变量声明。

1Oracle与MSSQL过程之间的转化Begin
2Oracle与MSSQL过程之间的转化    declare --变量 
3Oracle与MSSQL过程之间的转化        --过程
4Oracle与MSSQL过程之间的转化END
5Oracle与MSSQL过程之间的转化GO

      Oralce的总体结构如下,需要两个begin和end,一个是整个过程,一个是除去申明之外的过程。

1Oracle与MSSQL过程之间的转化BEGIN
2Oracle与MSSQL过程之间的转化   DECLARE
3Oracle与MSSQL过程之间的转化   --变量
4Oracle与MSSQL过程之间的转化   BEGIN
5Oracle与MSSQL过程之间的转化   --过程
6Oracle与MSSQL过程之间的转化   END;
7Oracle与MSSQL过程之间的转化END;
8Oracle与MSSQL过程之间的转化/


        第二步,修改声明变量。
        MSSQL需要在每个变量前面加 declare标示,Oracle只需要一个declare标示。此外注意修改各自的数据类型。
       
        第三步,修改游标。复杂的过程中离不开游标。因此更改游标结构经常用到。
        MSSQL的游标是全局的,需要建立之后再清空。而Oracle的游标类似于局部变量,使用完之后,自动清除。
        MSSQL游标结构如下:

Oracle与MSSQL过程之间的转化    set @tempSQL = ' declare allValues_Cursor cursor for '+CHAR(13+ CHAR(10)
Oracle与MSSQL过程之间的转化        
set @tempSQL =  @tempSQL + ' select POTABLENAME,POSPNAME from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580'
Oracle与MSSQL过程之间的转化        
--游标语句
Oracle与MSSQL过程之间的转化
    
Oracle与MSSQL过程之间的转化        
EXEC (@tempSQL)
Oracle与MSSQL过程之间的转化        
--1.创建游标
Oracle与MSSQL过程之间的转化

Oracle与MSSQL过程之间的转化    
OPEN allValues_Cursor
Oracle与MSSQL过程之间的转化        
--2.打开游标        
Oracle与MSSQL过程之间的转化

Oracle与MSSQL过程之间的转化    
--判断是否由符合游标条件的行,如果没有则关闭和释放游标,异常返回
Oracle与MSSQL过程之间的转化
    IF(@@CURSOR_ROWS = 0 )
Oracle与MSSQL过程之间的转化    
BEGIN
Oracle与MSSQL过程之间的转化        
CLOSE allValues_Cursor
Oracle与MSSQL过程之间的转化        
DEALLOCATE allValues_Cursor
Oracle与MSSQL过程之间的转化        
set @errorInfo = '没有指定表名或存储过程名!'
Oracle与MSSQL过程之间的转化        
print @errorInfo
Oracle与MSSQL过程之间的转化        
return
Oracle与MSSQL过程之间的转化    
END
Oracle与MSSQL过程之间的转化

Oracle与MSSQL过程之间的转化    
WHILE  (@@FETCH_STATUS <> -1)
Oracle与MSSQL过程之间的转化    
BEGIN
       FETCH  NEXT FROM allValues_Cursor INTO @tempPoTableName,@tempPoSpName
Oracle与MSSQL过程之间的转化        
--3进行数据处理        
Oracle与MSSQL过程之间的转化

Oracle与MSSQL过程之间的转化
    END
Oracle与MSSQL过程之间的转化
Oracle与MSSQL过程之间的转化    
CLOSE allValues_Cursor
Oracle与MSSQL过程之间的转化        
--4.关闭游标
Oracle与MSSQL过程之间的转化

Oracle与MSSQL过程之间的转化    
DEALLOCATE allValues_Cursor
Oracle与MSSQL过程之间的转化        
--5.注销游标    

       Oracle的游标是在变量中声明定义的,然后在过程中使用。其结构如下:

 

 1Oracle与MSSQL过程之间的转化--声明中
 2Oracle与MSSQL过程之间的转化    Cursor allValues_Cursor is
 3Oracle与MSSQL过程之间的转化         select UPPER(TRIM(POTABLENAME)),UPPER(TRIM(POSPNAME)) from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580;
 4Oracle与MSSQL过程之间的转化         --1.声明游标
 5Oracle与MSSQL过程之间的转化--过程中
 6Oracle与MSSQL过程之间的转化    OPEN allValues_Cursor;
 7Oracle与MSSQL过程之间的转化        --2.打开游标
 8Oracle与MSSQL过程之间的转化
 9Oracle与MSSQL过程之间的转化    WHILE allValues_Cursor%found LOOP
10Oracle与MSSQL过程之间的转化    FETCH allValues_Cursor INTO tempPoTableName,tempPoSpName;
11Oracle与MSSQL过程之间的转化        --3.处理数据
12Oracle与MSSQL过程之间的转化
13Oracle与MSSQL过程之间的转化    END LOOP;
14Oracle与MSSQL过程之间的转化    CLOSE allValues_Cursor;
15Oracle与MSSQL过程之间的转化        --4.关闭游标

        第四步修改赋值语句和比较语句。MSSQL中使用Set语句来赋值,Oracle中使用:=来赋值。此外MSSQL中的变量习惯前面增加一个@字符,在Oracle中可以删除。
        第五步修改逻辑结构。MSSQL中使用IF()....ELSE....
,结构体之间都要用BEGIN和END框起来。而Oracle则使用IF...THEN...ELSE..END IF结构,中间不必使用BEGIN和END。此外While结构差别也类似。
        第六步修改各自的调用方法和函数。常见的是MSSQL的EXEC (@tempSQL),对应Oracle的EXECUTE IMMEDIATE tempSQL。MSSQL的print函数,对应Oracle的DBMS_OUTPUT.PUT_LINE('')函数。此外还有各自使用的数据表,有所不同。例如MSSQL中所有的对象都在sysobjects表中,而Oracle中的表在user_tables中,过程在user_procedures中等。这些需要积累一些经验。

         最后不要忘了检查,Oracle的所有句子,必须要有分号表示结束。而MSSQL中不需要,即使加了也不错。几步下来,MSSQL过程就转化成Oracle。

          


相关文章:

  • 2021-06-11
  • 2021-09-12
  • 2021-07-20
  • 2022-02-10
  • 2022-12-23
  • 2022-03-04
猜你喜欢
  • 2021-05-28
  • 2022-03-10
  • 2021-12-01
  • 2022-12-23
  • 2021-12-26
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案