当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 14:53:00  来源:本站整理

MSSQL和Oracle之间的转化[MSSQL防范]

赞助商链接



  本文“MSSQL和Oracle之间的转化[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

这两天写数据库进级脚本,发现MSSQL和Oracle之间的转化还是对比简单的.

以下面两个历程为例.二者的功效类似.

1.MSSQL脚本

1 /** 更改表名 **/

2 Begin

3 declare @tempPoTableName varchar(50)--性能对象表名

4 declare @tempPoSpName varchar(50) --性能历程名

5 declare @errorInfo varchar(200) --错误信息

6 declare @cnt int --计数器

7

8 declare @tempSQL varchar(1000)

9

10 --定义表名、同步表名和存储历程游标

11 set @tempSQL = ' declare allValues_Cursor cursor for '+CHAR(13) + CHAR(10)

12 set @tempSQL = @tempSQL + ' select POTABLENAME,POSPNAME from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580'

13 EXEC (@tempSQL)

14

15 OPEN allValues_Cursor

16

17 --判断能否由符合游标条件的行,假如没有则关闭和释放游标,非常返回

18 IF(@@CURSOR_ROWS = 0 )

19 BEGIN

20 CLOSE allValues_Cursor

21 DEALLOCATE allValues_Cursor

22 set @errorInfo = '没有指定表名或存储历程名!'

23 print @errorInfo

24 return

25 END

26

27 print '开始更改原有表名……'

28 FETCH NEXT FROM allValues_Cursor INTO @tempPoTableName,@tempPoSpName

29 --按照给定的表名、存储历程名 成立呼应的数据存储存储历程

30 WHILE (@@FETCH_STATUS <> -1)

31 BEGIN

32 print @tempPoTableName

33

34 IF (EXISTS (SELECT name from sysobjects WHERE name=@tempPoTableName))

35 BEGIN

36 set @tempSQL = 'ALTER TABLE '+ @tempPoTableName+' DROP constraint PK_'+@tempPoTableName

37 EXEC (@tempSQL)

38 set @tempSQL = @tempPoTableName+'_TMP'

39 EXEC Sp_rename @tempPoTableName,@tempSQL

40 END

41 ELSE

42 BEGIN

43 print '没有找到表'+@tempPoTableName;

44 END

45

46 IF (EXISTS (SELECT name from sysobjects WHERE name=@tempPoSpName))

47 BEGIN

48 set @tempSQL = 'DROP PROCEDURE '+@tempPoSpName;

49 EXEC (@tempSQL)

50 END

51 ELSE

52 BEGIN

53 print '没有找到历程'+@tempPoSpName;

54 END

55

56 FETCH NEXT FROM allValues_Cursor INTO @tempPoTableName,@tempPoSpName

57 END

58 CLOSE allValues_Cursor

59 DEALLOCATE allValues_Cursor

60 print '完毕更改原有表名……'

61 print '------------------------'

62 END

63 GO

2.ORACLE脚本

1 BEGIN

2 DECLARE

3 tempPoTableName varchar2(50);--性能对象表名

4 tempPoSpName varchar2(50); --性能历程名

5 errorInfo varchar2(200); --错误信息

6 tempSQL varchar2(1000);

7 cnt1 number(1);

8 cnt2 number(2);

9

10 --定义表名、同步表名和存储历程游标

11 Cursor allValues_Cursor is

12 select UPPER(TRIM(POTABLENAME)),UPPER(TRIM(POSPNAME)) from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580;

13

14 BEGIN

15 OPEN allValues_Cursor;

16

17 --判断能否由符合游标条件的行,假如没有则关闭和释放游标,非常返回

18

19 DBMS_OUTPUT.PUT_LINE('开始更改原有表名……');

20 FETCH allValues_Cursor INTO tempPoTableName,tempPoSpName;

21 --按照给定的表名、存储历程名 成立呼应的数据存储存储历程

22 WHILE allValues_Cursor%found LOOP

23

24 cnt1:=0;

25 cnt2:=0;

26 BEGIN

27 SELECT 1 INTO cnt1 FROM dual WHERE exists(SELECT table_name FROM user_tables WHERE table_name = tempPoTableName);

28 SELECT 1 INTO cnt2 FROM dual WHERE exists(SELECT OBJECT_NAME FROM user_procedures WHERE OBJECT_NAME = tempPoSpName);

29 exception

30 WHEN no_data_found THEN

31 null;

32 END;

33

34 IF cnt1 = 1 THEN

35 DBMS_OUTPUT.PUT_LINE(tempPoTableName);

36 tempSQL := 'ALTER TABLE '||tempPoTableName||' DROP constraint PK_'||tempPoTableName;

37 EXECUTE IMMEDIATE tempSQL;

38 tempSQL := 'ALTER TABLE '||tempPoTableName||' RENAME TO '||tempPoTableName||'_TMP';

39 EXECUTE IMMEDIATE tempSQL;

40 ELSE

41 DBMS_OUTPUT.PUT_LINE('没有找到表'||tempPoTableName);

42 END IF;

43

44 IF cnt2 = 1 THEN

45 tempSQL := 'DROP PROCEDURE '||tempPoSpName;

46 EXECUTE IMMEDIATE tempSQL;

47 ELSE

48 DBMS_OUTPUT.PUT_LINE('没有找到历程'||tempPoSpName);

49 END IF;

50

51 FETCH allValues_Cursor INTO tempPoTableName,tempPoSpName;

52 END LOOP;

53 CLOSE allValues_Cursor;

54 DBMS_OUTPUT.PUT_LINE('完毕更改原有表名……');

55 DBMS_OUTPUT.PUT_LINE('------------------------');

56 END;

57 END;

58 /

上面两个是无名存储历程,不需求考虑能否已经存在该历程.关于闻名的历程需求考虑对象能否已经存在.

我是从MSSQL向Oracle转化的.

第一步,改正整体构造.

MSSQL的总体构造以下,只需求一个begin和end,中间加入变量声明.

1 Begin

2 declare --变量

3 --历程

4 END

5 GO

Oralce的总体构造以下,需求两个begin和end,一个是整个历程,一个是除去申明之外的历程.

1 BEGIN

2 DECLARE

3 --变量

4 BEGIN

5 --历程

6 END;

7 END;

8 /

第二步,改正声明变量.

MSSQL需求在每个变量前面加 declare标示,Oracle只需求一个declare标示.此外注意改正各自的数据范例.

第三步,改正游标.复杂的历程中离不开游标.因此更改游标构造常常用到.

MSSQL的游标是全局的,需求成立之后再清空.而Oracle的游标近似于部分变量,利用完之后,自动排除.

MSSQL游标构造以下:

set @tempSQL = ' declare allValues_Cursor cursor for '+CHAR(13) + CHAR(10)

set @tempSQL = @tempSQL + ' select POTABLENAME,POSPNAME from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580'

--游标语句

EXEC (@tempSQL)

--1.成立游标

OPEN allValues_Cursor

--2.翻开游标

--判断能否由符合游标条件的行,假如没有则关闭和释放游标,非常返回

IF(@@CURSOR_ROWS = 0 )

BEGIN

CLOSE allValues_Cursor

DEALLOCATE allValues_Cursor

set @errorInfo = '没有指定表名或存储历程名!'

print @errorInfo

return

END

WHILE (@@FETCH_STATUS <> -1)

BEGIN

FETCH NEXT FROM allValues_Cursor INTO @tempPoTableName,@tempPoSpName

--3举行数据处理

END

CLOSE allValues_Cursor

--4.关闭游标

DEALLOCATE allValues_Cursor

--5.注销游标

Oracle的游标是在变量中声明定义的,然后在历程中利用.其构造以下:

1 --声明中

2 Cursor allValues_Cursor is

3 select UPPER(TRIM(POTABLENAME)),UPPER(TRIM(POSPNAME)) from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580;

4 --1.声明游标

5 --历程中

6 OPEN allValues_Cursor;

7 --2.翻开游标

8

9 WHILE allValues_Cursor%found LOOP

10 FETCH allValues_Cursor INTO tempPoTableName,tempPoSpName;

11 --3.处理数据

12

13 END LOOP;

14 CLOSE allValues_Cursor;

15 --4.关闭游标

第四步改正赋值语句和对比语句.MSSQL中利用Set语句来赋值,Oracle中利用:=来赋值.此外MSSQL中的变量习惯前面增添一个@字符,在Oracle中可以删除.

第五步改正逻辑构造.MSSQL中利用IF()....ELSE....

,构造体之间都要用BEGIN和END框起来.而Oracle则利用IF...THEN...ELSE..END IF构造,中间没必要利用BEGIN和END.此外While构造差别也近似.

第五步改正逻辑构造.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.   以上是“MSSQL和Oracle之间的转化[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • MSSQL安全设置的具体步骤和办法小结
  • MSSQL 基本语法及实例操作语句
  • Debian Ubuntu下php连MSSQL
  • 常用的MSSQL日期函数
  • 怎样在Windows2003下设置MSSQL
  • <b>怎样复原MSSQL数据库</b>
  • 怎样导入本地数据到MSSQL远程数据库
  • 怎样更改IXWebHosting中MSSQL Quota的办法
  • MSSQL读取文件号令
  • Mssql反弹注射实录汇集
  • 对MSSQL数据库的判断与其特点
  • 查抄MSSQL存储历程
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .