oracle sqlserver 一些总结

 近一个项目 把sqlserver 移植到oracle   费了 很大的力

 尤其是oralce的分页存储过程  弄得好累 

把sqlserver的数据操作 改成oracle 的还是很简单的  把 dll  

换个  方法 类 换个  全部替换 就ok了  

当然 这里 有些 sql语句是由些差别的

 select top 10  在orcale 就不行  需要用  select * from tabel  where rownum >10

用rownum来处理这个问题 

sqlserver链接oracle 服务器  其实是很简单 的  只要 oracle 服务   的一些信息 对了  就 ok了

 执行   sp_addlinkedserver   创建链接服务器,指定   MSDAORA   为   provider_name,指定用于   Oracle   数据库实例的   SQL*Net   别名为   data_   source。    
   
  以下示例假设已将一个   SQL*Net   别名定义为   OracleDB。  
   
  sp_addlinkedserver   'OrclDB',   'Oracle',   'MSDAORA',   'OracleDB'  

二、使用   Microsoft   OLE   DB   Provider   For   ORACLE   链接ORACLE    
   
  1、建立链接数据库  
  sp_addlinkedserver   '别名',   'Oracle',   'MSDAORA',   '服务名'  
  GO  
  EXEC   sp_addlinkedsrvlogin     @rmtsrvname='别名  
   
  ',@useself='false',@locallogin='sa',@rmtuser='oracle用户名  
   
  ',@rmtpassword='密码'  
   
  2、查询数据  
   
  SELECT   *   FROM   别名..用户名.表(视图)  
   
  注意:四部分名称全部用大写  
   
  3、执行存储过程  
   
  使用OPENQUERY:  
  SELECT   *  
  FROM   OPENQUERY(别名,   'exec   用户名.存储过程名')  

 

 还有一点就是用  sqlserver的DTS 做数据的导入  就是很累了  有的时候 会出问题的 

 

 oracle存储过程的一点语法

1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
    参数1 IN NUMBER,
    参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN

END 存储过程名字

2.SELECT INTO STATEMENT
  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
  记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
  例子:
  BEGIN
  SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
      xxxx;
  END;
  ...

3.IF 判断
  IF V_TEST=1 THEN
    BEGIN
       do something
    END;
  END IF;

4.while 循环
  WHILE V_TEST=1 LOOP
  BEGIN
 XXXX
  END;
  END LOOP;

5.变量赋值
  V_TEST := 123;

6.用for in 使用cursor

  ...
  IS
  CURSOR cur IS SELECT * FROM xxx;
  BEGIN
 FOR cur_result in cur LOOP
  BEGIN
   V_SUM :=cur_result.列名1+cur_result.列名2
  END;
 END LOOP;
  END;

7.带参数的cursor
  CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
  OPEN C_USER(变量值);
  LOOP
 FETCH C_USER INTO V_NAME;
 EXIT FETCH C_USER%NOTFOUND;
    do something
  END LOOP;
  CLOSE C_USER;

 

 

 

oracle的一个排序分页存储过程

CREATE OR REPLACE PROCEDURE TABLEPAGE_SELECT(v_page_size  int, --the size of a page of list
                       v_current_page int, --the current page of list
                       v_table_name varchar2, --the talbe name
                       v_order_field varchar2,--the order field
                       v_order_sequence varchar2,--the order sequence should by "_desc"or "_asc",_is blank.
                       --v_sql_select  varchar2, --the select sql for procedure
                       --v_sql_count  varchar2, --the count sql for procedure
                       --v_out_recordcount OUT int, --the num of return rows
                       p_cursor OUT refcursor_pkg.return_cursor) as
 v_sql     varchar2(3000); --the sql for select all rows of list
 v_sql_count  varchar2(3000); --the count sql for procedure
 v_sql_order  varchar2(2000); --the order of list
 v_count    int; -- the amount rows fo original list
 v_endrownum  int; --the end row num of the current page
 v_startrownum int; --the start row num of the current page
BEGIN
 ----set the order of list
 if v_order_field!='NO' then
  v_sql_order :=' ORDER BY '|| v_order_field ||' '||v_order_sequence;
 else
   v_sql_order :='';
 end if;
 ----catch the amount rows of list
 v_sql_count:='SELECT COUNT(ROWNUM) FROM '||v_table_name;
 execute immediate v_sql_count into v_count;
 -- v_out_recordcount := v_count;
 ----set the value of start and end row
 if v_order_sequence='desc' then
  v_endrownum:=v_count-(v_current_page-1)*v_page_size;
  v_startrownum:=v_endrownum - v_page_size + 1;
 else
  v_endrownum:= v_current_page * v_page_size;
  v_startrownum := v_endrownum - v_page_size + 1;
 end if;
 ----the sql for page slide
 v_sql := 'SELECT * FROM (SELECT '||v_table_name||'.*, rownum rn FROM '||v_table_name||' WHERE rownum <= ' ||
      to_char(v_endrownum) ||' '|| v_sql_order||') WHERE rn >= ' ||
      to_char(v_startrownum)||' '||v_sql_order;
 open p_cursor for v_sql;
END TABLEPAGE_SELECT;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值