动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
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教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息



本月文章推荐
.获得Export/Import的trace文件.
.Oracle诊断案例4-Sql_trace.
.在Redhat Enterprise server 3上.
.Oracle 9i的两种工作模式.
.一些oracle的论坛和网站.
.了解Oracle Developer.
.Linux之菜鸟日记(二).
.使用ERRORSTACK进行错误跟踪及诊.
.Linux与Linux之间的互拔.
.ORACLE数据库的启动和关闭.
.Oracle数据库取消8080端口占用.
.Oracle弱智900问六.
.有关网格环境下的数据库系统的探.
.在Oracle10gisqlplus下登录dba用.
.Oracle 9i跳跃式索引扫描的小测试.
.ORACLE 应用经验(1).
.日志分析logmnr使用方法.
.完整的oracle rman备份恢复的例子.
.Use orabm To test system CPU.
.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的网络设置 人气:283
下一篇:oracle升级后exp出现oracle 942错误 人气:556
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-4 天空网络电影系统SKYUC v2.5.1 B
2008-7-4 PHPDug v2.0 多国语言版
2008-7-4 Drupal v7.x-dev Build 080704
2008-7-4 乐学LBBS无限级目录图片直读系统
2008-7-4 生成静态的美女小偷程序 v1.2
2008-7-4 顶级DJ舞曲网 v1.2 黑色正式版
2008-7-4 生活名片
2008-7-4 轩魂ASP中文验证码
2008-7-4 ip138手机归属地小偷
2008-6-21 PocketTouch简化iPod控制工具 v1
2008-6-21 HidePod万能隐藏 v1.0.9破解版
2008-6-21 TouchPad触摸板破解补丁 v4.42
2008-6-21 iCountDown倒计时工具 v2.0
2008-6-21 tt-Clock语音时钟 v1.0
2008-6-21 PowerManager重启工具
2008-6-21 JasonKit(iLM)离线地图切换软件
2008-6-21 iSlsk P2P下载工具 v0.2.1b
2008-6-21 MCaller来电归属地查询 v0.3破解


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報