网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.oracle trunc()函数的用法.
.oracle数据库-关于索引.
.Oracle基本数据类型存储格式浅析.
.从Oracle空间数据中诞生SVG.
.ORACLE性能诊断―学习statspack笔.
.Oracle数据库等待事件说明及处理.
.支持Web的OLAP.
.ORACLE 11g新特性简介.
.删除数据表中的重复记录.
.在UNIX下让ORACLE定时执行*.sql文.
.9i新特性之——在线表格重定义研.
.Oracle10g的UNDO_RETENTION自动化.
.oracle数据库的性能调整.
.Oracle Optimizer:迁移到使用基于.
.Oracle9i在RedHat7.1/7.2上的安装.
.ORACLE数据库傻瓜手册.
.Oracle-常用监控SQL.
.oracle9i日常操作总结.
.配置Oracle Enterprise Manager过.
.关于Oracle服务器性能全面调整攻.

Oracle与MSSQL过程之间的转化

发表日期:2008-2-9


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

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

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

      2.ORACLE脚本  1Oracle与MSSQL过程之间的转化(图三)BEGIN
 2Oracle与MSSQL过程之间的转化(图三)DECLARE
 3Oracle与MSSQL过程之间的转化(图三)    tempPoTableName varchar2(50);        --性能对象表名
 4Oracle与MSSQL过程之间的转化(图三)    tempPoSpName varchar2(50);            --性能过程名
 5Oracle与MSSQL过程之间的转化(图三)    errorInfo varchar2(200);             --错误信息
 6Oracle与MSSQL过程之间的转化(图三)    tempSQL    varchar2(1000);
 7Oracle与MSSQL过程之间的转化(图三)    cnt1   number(1);
 8Oracle与MSSQL过程之间的转化(图三)    cnt2   number(2);
 9Oracle与MSSQL过程之间的转化(图三)    
10Oracle与MSSQL过程之间的转化(图三)    --定义表名、同步表名和存储过程游标
11Oracle与MSSQL过程之间的转化(图三)    Cursor allValues_Cursor is
12Oracle与MSSQL过程之间的转化(图三)         select UPPER(TRIM(POTABLENAME)),UPPER(TRIM(POSPNAME)) from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580;
13Oracle与MSSQL过程之间的转化(图三)             
14Oracle与MSSQL过程之间的转化(图三)BEGIN
15Oracle与MSSQL过程之间的转化(图三)    OPEN allValues_Cursor;
16Oracle与MSSQL过程之间的转化(图三)
17Oracle与MSSQL过程之间的转化(图三)    --判定是否由符合游标条件的行,假如没有则关闭和释放游标,异常返回
18Oracle与MSSQL过程之间的转化(图三)    
19Oracle与MSSQL过程之间的转化(图三)    DBMS_OUTPUT.PUT_LINE('开始更改原有表名……');
20Oracle与MSSQL过程之间的转化(图三)    FETCH  allValues_Cursor INTO tempPoTableName,tempPoSpName;
21Oracle与MSSQL过程之间的转化(图三)    --根据给定的表名、存储过程名 创建相应的数据存储存储过程
22Oracle与MSSQL过程之间的转化(图三)    WHILE allValues_Cursor%found LOOP
23Oracle与MSSQL过程之间的转化(图三)    
24Oracle与MSSQL过程之间的转化(图三)    cnt1:=0;
25Oracle与MSSQL过程之间的转化(图三)    cnt2:=0;
26Oracle与MSSQL过程之间的转化(图三)    BEGIN
27Oracle与MSSQL过程之间的转化(图三)        SELECT 1 INTO cnt1 FROM dual WHERE exists(SELECT table_name FROM user_tables WHERE table_name = tempPoTableName);
28Oracle与MSSQL过程之间的转化(图三)        SELECT 1 INTO cnt2 FROM dual WHERE exists(SELECT OBJECT_NAME FROM user_procedures WHERE OBJECT_NAME = tempPoSpName);
29Oracle与MSSQL过程之间的转化(图三)    exception
30Oracle与MSSQL过程之间的转化(图三)    WHEN no_data_found  THEN
31Oracle与MSSQL过程之间的转化(图三)        null;
32Oracle与MSSQL过程之间的转化(图三)    END;
33Oracle与MSSQL过程之间的转化(图三)    
34Oracle与MSSQL过程之间的转化(图三)    IF cnt1 = 1 THEN
35Oracle与MSSQL过程之间的转化(图三)        DBMS_OUTPUT.PUT_LINE(tempPoTableName);
36Oracle与MSSQL过程之间的转化(图三)        tempSQL := 'ALTER TABLE 'tempPoTableName' DROP constraint PK_'tempPoTableName;
37Oracle与MSSQL过程之间的转化(图三)        EXECUTE IMMEDIATE tempSQL;
38Oracle与MSSQL过程之间的转化(图三)        tempSQL := 'ALTER TABLE 'tempPoTableName' RENAME TO 'tempPoTableName'_TMP';
39Oracle与MSSQL过程之间的转化(图三)        EXECUTE IMMEDIATE tempSQL;
40Oracle与MSSQL过程之间的转化(图三)    ELSE
41Oracle与MSSQL过程之间的转化(图三)        DBMS_OUTPUT.PUT_LINE('没有找到表'tempPoTableName);
42Oracle与MSSQL过程之间的转化(图三)    END IF;
43Oracle与MSSQL过程之间的转化(图三)    
44Oracle与MSSQL过程之间的转化(图三)    IF cnt2 = 1 THEN
45Oracle与MSSQL过程之间的转化(图三)        tempSQL := 'DROP PROCEDURE 'tempPoSpName;
46Oracle与MSSQL过程之间的转化(图三)        EXECUTE IMMEDIATE tempSQL;
47Oracle与MSSQL过程之间的转化(图三)    ELSE
48Oracle与MSSQL过程之间的转化(图三)        DBMS_OUTPUT.PUT_LINE('没有找到过程'tempPoSpName);
49Oracle与MSSQL过程之间的转化(图三)    END IF;
50Oracle与MSSQL过程之间的转化(图三)    
51Oracle与MSSQL过程之间的转化(图三)        FETCH allValues_Cursor INTO tempPoTableName,tempPoSpName;
52Oracle与MSSQL过程之间的转化(图三)    END LOOP;
53Oracle与MSSQL过程之间的转化(图三)    CLOSE allValues_Cursor;
54Oracle与MSSQL过程之间的转化(图三)    DBMS_OUTPUT.PUT_LINE('结束更改原有表名……');
55Oracle与MSSQL过程之间的转化(图三)    DBMS_OUTPUT.PUT_LINE('------------------------');
56Oracle与MSSQL过程之间的转化(图三)    END;
57Oracle与MSSQL过程之间的转化(图三)END;
58Oracle与MSSQL过程之间的转化(图三)/
       上面两个是无名存储过程,不需要考虑是否已经存在该过程。对于有名的过程需要考虑对象是否已经存在。
        我是从MSSQL向Oracle转化的。
      第一步,修改整体结构。
      MSSQL的总体结构如下,只需要一个begin和end,中间加入变量声明。
1Oracle与MSSQL过程之间的转化(图三)Begin
2Oracle与MSSQL过程之间的转化(图三)    declare --变量 
3Oracle与MSSQL过程之间的转化(图三)        --过程
4Oracle与MSSQL过程之间的转化(图三)END
5Oracle与MSSQL过程之间的转化(图三)GO       Oralce的总体结构如下,需要两个begin和end,一个是整个过程,一个是除去申明之外的过程。 1Oracle与MSSQL过程之间的转化(图三)BEGIN
2Oracle与MSSQL过程之间的转化(图三)   DECLARE
3Oracle与MSSQL过程之间的转化(图三)   --变量
4Oracle与MSSQL过程之间的转化(图三)   BEGIN
5Oracle与MSSQL过程之间的转化(图三)   --过程
6Oracle与MSSQL过程之间的转化(图三)   END;
7Oracle与MSSQL过程之间的转化(图三)END;
8Oracle与MSSQL过程之间的转化(图三)/
        第二步,修改声明变量。
        MSSQL需要在每个变量前面加 declare标示,Oracle只需要一个declare标示。此外注重修改各自的数据类型。
       
        第三步,修改游标。复杂的过程中离不开游标。因此更改游标结构经常用到。
        MSSQL的游标是全局的,需要建立之后再清空。而Oracle的游标类似于局部变量,使用完之后,自动清除。
        MSSQL游标结构如下: Oracle与MSSQL过程之间的转化(图三)    set @tempSQL = ' declare allValues_Cursor cursor for '+CHAR(13) + CHAR(10)
Oracle与MSSQL过程之间的转化(图三)        set @tempSQL =  @tempSQL + ' select POTABLENAME,POSPNAME from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580'
Oracle与MSSQL过程之间的转化(图三)        --游标语句
Oracle与MSSQL过程之间的转化(图三)    
Oracle与MSSQL过程之间的转化(图三)        EXEC (@tempSQL)
Oracle与MSSQL过程之间的转化(图三)        --1.创建游标
Oracle与MSSQL过程之间的转化(图三)
Oracle与MSSQL过程之间的转化(图三)    OPEN allValues_Cursor
Oracle与MSSQL过程之间的转化(图三)        --2.打开游标        
Oracle与MSSQL过程之间的转化(图三)
Oracle与MSSQL过程之间的转化(图三)    --判定是否由符合游标条件的行,假如没有则关闭和释放游标,异常返回
Oracle与MSSQL过程之间的转化(图三)    IF(@@CURSOR_ROWS = 0 )
Oracle与MSSQL过程之间的转化(图三)    BEGIN
Oracle与MSSQL过程之间的转化(图三)        CLOSE allValues_Cursor
Oracle与MSSQL过程之间的转化(图三)        DEALLOCATE allValues_Cursor
Oracle与MSSQL过程之间的转化(图三)        set @errorInfo = '没有指定表名或存储过程名!'
Oracle与MSSQL过程之间的转化(图三)        print @errorInfo
Oracle与MSSQL过程之间的转化(图三)        return
Oracle与MSSQL过程之间的转化(图三)    END
Oracle与MSSQL过程之间的转化(图三)
Oracle与MSSQL过程之间的转化(图三)    WHILE  (@@FETCH_STATUS <> -1)
Oracle与MSSQL过程之间的转化(图三)    BEGIN
       FETCH  NEXT FROM allValues_Cursor INTO @tempPoTableName,@tempPoSpName
Oracle与MSSQL过程之间的转化(图三)        --3进行数据处理        
Oracle与MSSQL过程之间的转化(图三)
Oracle与MSSQL过程之间的转化(图三)    END
Oracle与MSSQL过程之间的转化(图三)
Oracle与MSSQL过程之间的转化(图三)    CLOSE allValues_Cursor
Oracle与MSSQL过程之间的转化(图三)        --4.关闭游标
Oracle与MSSQL过程之间的转化(图三)
Oracle与MSSQL过程之间的转化(图三)    DEALLOCATE allValues_Cursor
Oracle与MSSQL过程之间的转化(图三)        --5.注销游标    
       Oracle的游标是在变量中声明定义的,然后在过程中使用。其结构如下:    1Oracle与MSSQL过程之间的转化(图三)--声明中
 2Oracle与MSSQL过程之间的转化(图三)    Cursor allValues_Cursor is
 3Oracle与MSSQL过程之间的转化(图三)         select UPPER(TRIM(POTABLENAME)),UPPER(TRIM(POSPNAME)) from PM_NEPODEF_TABLE WHERE POID>110499 and POID<110580;
 4Oracle与MSSQL过程之间的转化(图三)         --1.声明游标
 5Oracle与MSSQL过程之间的转化(图三)--过程中
 6Oracle与MSSQL过程之间的转化(图三)    OPEN allValues_Cursor;
 7Oracle与MSSQL过程之间的转化(图三)        --2.打开游标
 8Oracle与MSSQL过程之间的转化(图三)
 9Oracle与MSSQL过程之间的转化(图三)    WHILE allValues_Cursor%found LOOP
10Oracle与MSSQL过程之间的转化(图三)    FETCH allValues_Cursor INTO tempPoTableName,tempPoSpName;
11Oracle与MSSQL过程之间的转化(图三)        --3.处理数据
12Oracle与MSSQL过程之间的转化(图三)
13Oracle与MSSQL过程之间的转化(图三)    END LOOP;
14Oracle与MSSQL过程之间的转化(图三)    CLOSE allValues_Cursor;
15Oracle与MSSQL过程之间的转化(图三)        --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。
上一篇:10gRAC系列之10gRAC的网络设置 人气:563
下一篇:oracle升级后exp出现oracle 942错误 人气:1196
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐