知识大全 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 GOORACLE脚本
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 GOOralce的总体结构如下 需要两个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相关参考