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防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |