现在的位置: 首页 > 综合 > 正文

Sybase脚本修改为oracle脚本备忘

2013年08月29日 ⁄ 综合 ⁄ 共 1840字 ⁄ 字号 评论关闭

    最近有一个项目要把原来使用的Sybase数据库改为Oracle数据库, 所以我要把sybase的脚本改成oracle的脚本, 如表结构, 存储过程, 视图等的脚本.  这种改脚本的情况可能很久才能遇到一次吧, 放到blog里面, 以后需要自己再看看, 温故知新.

(所用sybase版本是11.9.2,  oracle是10g)

 

 1. if exists
   用正则表达式 where  id = object_id/(/'[A-Z_]+/'/)
   判断表是否存在这段不要了, 直接drop table

2. go (注意要用全词匹配)
   替换为 /

3. varchar (这个要提前换)
   替换为 varchar2

4. text
   替换为 varchar2(4000), 还不够的话可以用 clob代替

5. datetime
   替换为 date, 或者 TIMESTAMP, 后者精确到毫秒

6. 创建表的脚本中不要存在空行, 不然在用命令窗口导入的时候会出现错误

   在editplus中用 正则表达式 ^[ /t]*/n 替换为 空格 取消空行( ^ 为行头开始, /n 为换行符)

   全部替换的按钮按多几次, 再检查下

7. dbo.
   替换为空格或者用户名

8. 建立主键
 CONSTRAINT PK_BDG_SDC_PRJ_ZP  PRIMARY KEY CLUSTERED (ID)
   中的CLUSTERED 要去掉

9. 去掉 LOCK ALLPAGES

10. getdate()
    替换为 sysdate

11. isnull()
    替换为 nvl()

11. 如果出现重复创建表的时候
    把表上面的注释  /*********/               /****************
                    /*        */    改为      *               * 
                    /*********/               *****************/
     原先不是很清楚, 不过通常是下面要建立的表的名称太长就会出现这种情况 

12. 存储过程
    A. 参数: 在存储过程名称后面(p1, p2,.....)
      命名开头不能为 @ ;
             要指明in 和 out ;
             参数类型不能带括号部分;
    B. 变量: 不用关键字 declare ,  直接" t_time  varchar2(20); t_seq int; "(注意要带" ; ") ;
             在as 和 begin 中间定义;
             给变量赋值 " varA := value; "
                      和" select keyA into varA from tableA; " ;    

    C. 在每个完整的语句后面要加 " ; ";

       没有直接" return 1 ; "的, 但是可以" return; " 直接中断存储过程;

       没有" begin transaction ", 但可以用" commit; "和" rollback; " (是不是每次执行都会建立隐性的事务我就不知道了);
      
       要返回select的结果集, 必须用游标, 不过需要建立一个包A才行, 在这个包A中定义一个"type cursorType is ref cursor; "这样一个游标
       类型, 然后再加一个输出参数"p_cursor out A.cursorType ", 内容里面" open  p_cursor  for select ......; " ;

       DDL的语句必须用动态SQL, 如"v_sql:='drop table TMP_XMZ_REPORT';  EXECUTE IMMEDIATE v_sql; ";

    D. 控制结构
       if...else
       sybase: if(条件) begin 代码块 end(如果只有一句代码, 可以不用begin end)
               else begin 代码块 end(如果只有一句代码, 可以不用begin end)
       oracle: if(条件) then 代码块
               else 代码块 end if;

    E. 游标
       在sybase里面可以直接 " declare  CUR1 cursor for  select..... ", 这个貌似在oracle不行,
       不过可以用" for  cur1_record in ( select....) loop 代码块 end loop; "; 

 

 

 

抱歉!评论已关闭.