Oracle与MSSQL过程之间的转化

 

 

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

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

       1.MSSQL脚本

 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /** 更改表名 **/
 2 None.gif Begin
 3 None.gif     declare   @tempPoTableName   varchar ( 50 )         -- 性能对象表名
 4 None.gif      declare   @tempPoSpName   varchar ( 50 )             -- 性能过程名
 5 None.gif      declare   @errorInfo   varchar ( 200 )              -- 错误信息
 6 None.gif      declare   @cnt   int                              -- 计数器
 7 None.gif     
 8 None.gif     declare   @tempSQL      varchar ( 1000 )
 9 None.gif    
10 None.gif     -- 定义表名、同步表名和存储过程游标
11 None.gif      set   @tempSQL   =   '  declare allValues_Cursor cursor for  ' + CHAR ( 13 +   CHAR ( 10 )
12 None.gif         set   @tempSQL   =    @tempSQL   +   '  select POTABLENAME,POSPNAME from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580 '
13 None.gif     EXEC  ( @tempSQL )
14 None.gif
15 None.gif     OPEN  allValues_Cursor
16 None.gif
17 None.gif     -- 判断是否由符合游标条件的行,如果没有则关闭和释放游标,异常返回
18 None.gif      IF ( @@CURSOR_ROWS   =   0  )
19 None.gif     BEGIN
20 None.gif         CLOSE  allValues_Cursor
21 None.gif         DEALLOCATE  allValues_Cursor
22 None.gif         set   @errorInfo   =   ' 没有指定表名或存储过程名! '
23 None.gif         print   @errorInfo
24 None.gif         return
25 None.gif     END     
26 None.gif    
27 None.gif     print   ' 开始更改原有表名…… '
28 None.gif     FETCH    NEXT   FROM  allValues_Cursor  INTO   @tempPoTableName , @tempPoSpName
29 None.gif     -- 根据给定的表名、存储过程名 创建相应的数据存储存储过程
30 None.gif      WHILE   ( @@FETCH_STATUS   <>   - 1 )
31 None.gif     BEGIN
32 None.gif         print   @tempPoTableName
33 None.gif        
34 None.gif         IF  ( EXISTS  ( SELECT  name  from  sysobjects  WHERE  name = @tempPoTableName ))
35 None.gif         BEGIN
36 None.gif         set   @tempSQL   =   ' ALTER TABLE  ' +   @tempPoTableName + '  DROP constraint PK_ ' + @tempPoTableName
37 None.gif         EXEC  ( @tempSQL )
38 None.gif         set   @tempSQL   =   @tempPoTableName + ' _TMP '
39 None.gif         EXEC  Sp_rename  @tempPoTableName , @tempSQL
40 None.gif         END
41 None.gif         ELSE
42 None.gif         BEGIN
43 None.gif         print   ' 没有找到表 ' + @tempPoTableName ;
44 None.gif         END    
45 None.gif
46 None.gif         IF  ( EXISTS  ( SELECT  name  from  sysobjects  WHERE  name = @tempPoSpName ))
47 None.gif         BEGIN
48 None.gif         set   @tempSQL   =   ' DROP PROCEDURE  ' + @tempPoSpName ;
49 None.gif         EXEC  ( @tempSQL )
50 None.gif         END
51 None.gif         ELSE
52 None.gif         BEGIN
53 None.gif         print   ' 没有找到过程 ' + @tempPoSpName ;
54 None.gif         END
55 None.gif
56 None.gif     FETCH    NEXT   FROM  allValues_Cursor  INTO   @tempPoTableName , @tempPoSpName
57 None.gif     END
58 None.gif     CLOSE  allValues_Cursor
59 None.gif     DEALLOCATE  allValues_Cursor
60 None.gif     print   ' 结束更改原有表名…… '
61 None.gif     print   ' ------------------------ '
62 None.gif END
63 None.gif GO

      2.ORACLE脚本

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


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

1 None.gif Begin
2 None.gif     declare --变量  
3 None.gif         -- 过程
4 None.gif END
5 None.gif GO

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

1 None.gif BEGIN
2 None.gif    DECLARE
3 None.gif    -- 变量
4 None.gif     BEGIN
5 None.gif    -- 过程
6 None.gif     END ;
7 None.gif END ;
8 None.gif /


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

None.gif      set   @tempSQL   =   '  declare allValues_Cursor cursor for  ' + CHAR ( 13 +   CHAR ( 10 )
None.gif        
set   @tempSQL   =    @tempSQL   +   '  select POTABLENAME,POSPNAME from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580 '
None.gif        
-- 游标语句
None.gif
    
None.gif        
EXEC  ( @tempSQL )
None.gif        
-- 1.创建游标
None.gif

None.gif    
OPEN  allValues_Cursor
None.gif        
-- 2.打开游标        
None.gif

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

None.gif    
WHILE   ( @@FETCH_STATUS   <>   - 1 )
None.gif    
BEGIN
       FETCH  NEXT FROM allValues_Cursor INTO @tempPoTableName,@tempPoSpName
None.gif        
-- 3进行数据处理        
None.gif

None.gif
     END
None.gif
None.gif    
CLOSE  allValues_Cursor
None.gif        
--4 .关闭游标
None.gif

None.gif    
DEALLOCATE  allValues_Cursor
None.gif        
--5 .注销游标    

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

 

 1 None.gif -- 声明中
 2 None.gif      Cursor  allValues_Cursor  is
 3 None.gif          select   UPPER (TRIM(POTABLENAME)), UPPER (TRIM(POSPNAME))  from  PM_NEPODEF_TABLE  WHERE  POID > 110499   and  POID < 110580 ;
 4 None.gif          -- 1.声明游标
 5 None.gif-- 过程中
 6 None.gif      OPEN  allValues_Cursor;
 7 None.gif         -- 2.打开游标
 8 None.gif
 9 None.gif     WHILE  allValues_Cursor % found LOOP
10 None.gif     FETCH  allValues_Cursor  INTO  tempPoTableName,tempPoSpName;
11 None.gif         -- 3.处理数据
12 None.gif
13 None.gif     END  LOOP;
14 None.gif     CLOSE  allValues_Cursor;
15 None.gif         -- 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。

          


转载于:https://www.cnblogs.com/xiaoyz/archive/2006/07/28/462344.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值