知识大全 Oracle与MSSQL过程之间的转化

Posted 过程

篇首语:只会幻想而不行动的人,永远也体会不到收获果实时的喜悦。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Oracle与MSSQL过程之间的转化相关的知识,希望对你有一定的参考价值。

Oracle与MSSQL过程之间的转化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

这两天写数据库升级脚本 发现MSSQL和Oracle之间的转化还是比较容易的        以下面两个过程为例 两者的功能相似        MSSQL脚本   /**//** 更改表名 **/  Begin      declare @tempPoTableName varchar( )         性能对象表名      declare @tempPoSpName varchar( )             性能过程名      declare @errorInfo varchar( )              错误信息      declare @cnt int                             计数器            declare @tempSQL    varchar( )            定义表名 同步表名和存储过程游标     set @tempSQL =   declare allValues_Cursor cursor for  +CHAR( ) + CHAR( )         set @tempSQL =  @tempSQL +   select POTABLENAME POSPNAME from PM_NEPODEF_TABLE WHERE POID>  and POID<     EXEC (@tempSQL)     OPEN allValues_Cursor      判断是否由符合游标条件的行 如果没有则关闭和释放游标 异常返回     IF(@@CURSOR_ROWS =   )     BEGIN         CLOSE allValues_Cursor         DEALLOCATE allValues_Cursor         set @errorInfo =  没有指定表名或存储过程名!         print @errorInfo         return     END              print  开始更改原有表名……     FETCH  NEXT FROM allValues_Cursor INTO @tempPoTableName @tempPoSpName      根据给定的表名 存储过程名 创建相应的数据存储存储过程     WHILE  (@@FETCH_STATUS <>  )     BEGIN         print @tempPoTableName                  IF (EXISTS (SELECT name from sysobjects WHERE name=@tempPoTableName))         BEGIN         set @tempSQL =  ALTER TABLE  + @tempPoTableName+  DROP constraint PK_ +@tempPoTableName         EXEC (@tempSQL)         set @tempSQL = @tempPoTableName+ _TMP         EXEC Sp_rename @tempPoTableName @tempSQL         END         ELSE         BEGIN         print  没有找到表 +@tempPoTableName;         END            IF (EXISTS (SELECT name from sysobjects WHERE name=@tempPoSpName))         BEGIN         set @tempSQL =  DROP PROCEDURE  +@tempPoSpName;         EXEC (@tempSQL)         END         ELSE         BEGIN         print  没有找到过程 +@tempPoSpName;         END     FETCH  NEXT FROM allValues_Cursor INTO @tempPoTableName @tempPoSpName     END     CLOSE allValues_Cursor     DEALLOCATE allValues_Cursor     print  结束更改原有表名……     print  END GO

   ORACLE脚本

  BEGIN  DECLARE      tempPoTableName varchar ( );         性能对象表名      tempPoSpName varchar ( );             性能过程名      errorInfo varchar ( );              错误信息      tempSQL    varchar ( );      cnt    number( );      cnt    number( );            定义表名 同步表名和存储过程游标     Cursor allValues_Cursor is          select UPPER(TRIM(POTABLENAME)) UPPER(TRIM(POSPNAME)) from PM_NEPODEF_TABLE WHERE POID>  and POID< ;               BEGIN     OPEN allValues_Cursor;      判断是否由符合游标条件的行 如果没有则关闭和释放游标 异常返回          DBMS_OUTPUT PUT_LINE( 开始更改原有表名…… );     FETCH  allValues_Cursor INTO tempPoTableName tempPoSpName;      根据给定的表名 存储过程名 创建相应的数据存储存储过程     WHILE allValues_Cursor%found LOOP          cnt := ;     cnt := ;     BEGIN         SELECT   INTO cnt  FROM dual WHERE exists(SELECT table_name FROM user_tables WHERE table_name = tempPoTableName);         SELECT   INTO cnt  FROM dual WHERE exists(SELECT OBJECT_NAME FROM user_procedures WHERE OBJECT_NAME = tempPoSpName);     exception     WHEN no_data_found  THEN         null;     END;          IF cnt  =   THEN         DBMS_OUTPUT PUT_LINE(tempPoTableName);         tempSQL :=  ALTER TABLE  ||tempPoTableName||  DROP constraint PK_ ||tempPoTableName;         EXECUTE IMMEDIATE tempSQL;         tempSQL :=  ALTER TABLE  ||tempPoTableName||  RENAME TO  ||tempPoTableName|| _TMP ;         EXECUTE IMMEDIATE tempSQL;     ELSE         DBMS_OUTPUT PUT_LINE( 没有找到表 ||tempPoTableName);     END IF;          IF cnt  =   THEN         tempSQL :=  DROP PROCEDURE  ||tempPoSpName;         EXECUTE IMMEDIATE tempSQL;     ELSE         DBMS_OUTPUT PUT_LINE( 没有找到过程 ||tempPoSpName);     END IF;              FETCH allValues_Cursor INTO tempPoTableName tempPoSpName;     END LOOP;     CLOSE allValues_Cursor;     DBMS_OUTPUT PUT_LINE( 结束更改原有表名…… );     DBMS_OUTPUT PUT_LINE( );     END; END; /

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

Begin     declare 变量           过程 END GO

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

BEGIN    DECLARE     变量    BEGIN     过程    END; END; /

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

    set @tempSQL =   declare allValues_Cursor cursor for  +CHAR( ) + CHAR( )        set @tempSQL =  @tempSQL +   select POTABLENAME POSPNAME from PM_NEPODEF_TABLE WHERE POID>  and POID<          游标语句            EXEC (@tempSQL)         创建游标    OPEN allValues_Cursor         打开游标             判断是否由符合游标条件的行 如果没有则关闭和释放游标 异常返回    IF(@@CURSOR_ROWS =   )    BEGIN        CLOSE allValues_Cursor        DEALLOCATE allValues_Cursor        set @errorInfo =  没有指定表名或存储过程名!         print @errorInfo        return    END    WHILE  (@@FETCH_STATUS <>  )    BEGIN       FETCH  NEXT FROM allValues_Cursor INTO @tempPoTableName @tempPoSpName         进行数据处理            END    CLOSE allValues_Cursor         关闭游标    DEALLOCATE allValues_Cursor         注销游标    

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

  声明中      Cursor allValues_Cursor is           select UPPER(TRIM(POTABLENAME)) UPPER(TRIM(POSPNAME)) from PM_NEPODEF_TABLE WHERE POID>  and POID< ;            声明游标  过程中      OPEN allValues_Cursor;           打开游标        WHILE allValues_Cursor%found LOOP     FETCH allValues_Cursor INTO tempPoTableName tempPoSpName;          处理数据     END LOOP;     CLOSE allValues_Cursor;          关闭游标 cha138/Article/program/Oracle/201311/17883

相关参考