把sqlserver中存储过程改写到oracle中

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:
一同学叫我帮忙改存储过程sqlserver----->oralce数据中:
 
sqlserver中存储过程:
SET QUOTED_IDENTIFIER  ON    
GO 
SET ANSI_NULLS  ON    
GO 


ALTER     PROCEDURE [dbo].[getxftjbyxh] 
@xh  varchar(13),@nd  varchar(4),@jb  varchar(1) 
--with encryption    
as 
begin 
   SET NOCOUNT  ON 
   DECLARE @kcbm  varchar(7),@kcmc  VARCHAR(40),@cj  decimal(4,1),@xf  decimal(4,1), 
    @kcdlbm  varchar(1),@kclbbm  varchar(7),@tkcbm  varchar(7),@tkcmc  VARCHAR(40) 
   declare @tmpk  int,@zybzbm  varchar(10),@t_xf  decimal(4,1) 
   select @zybzbm=zybzbm  from t_xs  where xh=@xh 
   declare @ TEMP  table    
         (    
                 kcbm  varchar(7), 
                 kcmc  VARCHAR(40),    
                 cj  decimal(4,1), 
    xf  decimal(4,1), 
      kcdlbm  varchar(1), 
    kclbbm  varchar(7), 
    tkcbm  varchar(7), 
                 tkcmc  VARCHAR(40) 
         )    
    
   DECLARE t_cursor  CURSOR  FOR    
     select v.kcbm,v.cj,b.kclbbm,b.kcdlbm,xf=( select xf  from b_kc  where b_kc.kcbm=v.kcbm), 
    kcmc=( select kcmc  from b_kc  where b_kc.kcbm=v.kcbm) 
     from v_xscj v  left  outer  join b_bzjh b    
     on v.kcbm=b.kcbm  and b.zfx= '1'    
     and b.zybzbm=@zybzbm 
     and b.nd=@nd  and b.jb=@jb 
     where v.xh=@xh 
     order  by b.kcdlbm,b.kclbbm 
    
   OPEN t_cursor 
   FETCH NEXT  FROM t_cursor    
   INTO @kcbm,@cj,@kclbbm,@kcdlbm,@xf,@kcmc 
    
   WHILE @@FETCH_STATUS = 0 
   BEGIN 
         if @kclbbm  is  NULL  or @kcdlbm  is  NULL 
         begin 
     select @tmpk= count(*)  from b_ggjh  where kcbm=@kcbm 
     if @tmpk>0    
     begin 
          INSERT  INTO @ temp(kcbm,kcmc,cj,xf,kcdlbm,kclbbm,tkcbm,tkcmc)    
       values(@kcbm,@kcmc,@cj,@xf, 'B', '0000000', NULL, NULL)        
     end 
     else 
     begin 
          declare t1  cursor  for 
          select b.kcbm,b.kclbbm,b.kcdlbm,xf=( select xf  from b_kc  where b_kc.kcbm=b.kcbm),kcmc=( select kcmc  from b_kc  where b_kc.kcbm=b.kcbm) 
       from b_bzjh b,t_tdkc t 
       where b.kcbm=t.kcbm  and t.tdkcbm=@kcbm  and t.zybzbm=@zybzbm 
       and t.kcbm  not  in ( select kcbm  from v_xscj  where xh=@xh) 
       and b.zybzbm=@zybzbm  and b.nd=@nd  and b.jb=@jb  and b.zfx= '1'            
          open t1 
          fetch next  from t1 
             into @tkcbm,@kclbbm,@kcdlbm,@t_xf,@tkcmc 
          if @@FETCH_STATUS=0 
          begin 
                  while @@FETCH_STATUS=0 
                                              begin 
                     INSERT  INTO @ temp(kcbm,kcmc,cj,xf,kcdlbm,kclbbm,tkcbm,tkcmc)    
                     values(@kcbm,@kcmc,@cj,@t_xf,@kcdlbm,@kclbbm,@tkcbm,@tkcmc)        
                                  fetch next  from t1 
                                                 into @tkcbm,@kclbbm,@kcdlbm,@t_xf,@tkcmc    
                                              end    
          end     
                         else 
          begin 
                                 INSERT  INTO @ temp(kcbm,kcmc,cj,xf,kcdlbm,kclbbm,tkcbm,tkcmc)    
                              values(@kcbm,@kcmc,@cj,@xf, NULL, NULL, NULL, NULL)                
                         end            
          CLOSE t1 
             DEALLOCATE t1        
     end 
         end 
         else 
         begin 
     INSERT  INTO @ temp(kcbm,kcmc,cj,xf,kcdlbm,kclbbm,tkcbm,tkcmc)    
                  values(@kcbm,@kcmc,@cj,@xf,@kcdlbm,@kclbbm, NULL, NULL
         end     
         FETCH NEXT  FROM t_cursor    
     INTO @kcbm,@cj,@kclbbm,@kcdlbm,@xf,@kcmc    
                 END 
   close t_cursor 
   deallocate t_cursor 
   select *  from @ TEMP    
end 


GO 
SET QUOTED_IDENTIFIER  OFF    
GO 
SET ANSI_NULLS  ON    
GO 
对应的oracle的存储过程:
--(1)定义游标(返回) 

create  or  replace package TestPackage  is 
type TestResultSet  is ref  cursor
end TestPackage ; 

    

--实现创建临时表,往临时表中添加记录,返回记录集 

--(2)先用一存储过创建临时表 
create  or  replace  procedure p_createtemptalbe    
authid  current_user  is     
v_num number; 

begin 
--create temporary table        
select  count(*)  into v_num  from user_tables  where table_name= 'newtemptable';    
if v_num<1  then        
execute immediate ' CREATE GLOBAL  TEMPORARY  TABLE newtemptable (         
kcbm varchar2(7), 
kcmc varchar2(40),    
cj number(4,1), 
xf number(4,1), 
kcdlbm varchar2(1), 
kclbbm varchar2(7), 
tkcbm varchar2(7), 
tkcmc varchar2(40)     
ON  COMMIT PRESERVE ROWS';        
     
end  if
end p_createtemptalbe ; 

--(3)执行存储过程 
call p_createtemptalbe(); 




--(4)往临时表中添加记录,返回记录集    


create  or  replace  procedure getxftjbyxh (vxh  in varchar2,vnd  in varchar2,vjb  in varchar2, pRecCur OUT TestPackage.TestResultSet ) 
authid  current_user  is     
v_num number; 
v_num_ct number; 
begin 
declare 
vkcbm varchar2(7); 
vkcmc varchar2(40); 
vcj number(4,1); 
vxf number(4,1); 
vkcdlbm varchar2(1); 
vkclbbm varchar2(7); 
vtkcbm varchar2(7); 
vtkcmc varchar2(40); 
    
vtmpk number; 
vt_xvzybzbm  varchar(10); 
vt_xf number(4,1); 



begin 
    
select zybzbm  into vzybzbm  from t_xs  where xh=vxh; 
v_num_ct :=1; 
declare    
--CURSOR cur_bookisbn     IS select b.bookid,b.book_isbn from bookinfo b where b.publishid = '1000000158'; 
Cursor t_cursor  CURSOR  FOR    
     select v.kcbm,v.cj,b.kclbbm,b.kcdlbm,( select xf  from b_kc  where    

b_kc.kcbm=v.kcbm) xf, 
    ( select kcmc  from b_kc  where b_kc.kcbm=v.kcbm) kcmc 
     from v_xscj v  left  outer  join b_bzjh b    
     on v.kcbm=b.kcbm  and b.zfx= '1'    
     and b.zybzbm=vzybzbm 
     and b.nd=vnd  and b.jb=vjb 
     where v.xh=vxh 
     order  by b.kcdlbm,b.kclbbm; 
begin 
--清空临时表,一般是自动清空的 

select  count(*)  into v_num  from newtemptable; 
if v_num>0  then 
execute immediate  'truncate table newtemptable'
end  if ; 
    

OPEN t_cursor; 
   FETCH    t_cursor  INTO vkcbm,vcj,vkclbbm,vkcdlbm,vxf,vkcmc; 
   EXIT  WHEN t_cursor %NOTFOUND;    
   BEGIN 
         if vkclbbm  is  NULL  or vkcdlbm  is  NULL  then 
         begin 
     select  count(*)  into vtmpk  from b_ggjh  where kcbm=vkcbm; 
     if vtmpk>0     then 
     begin 
          INSERT  INTO newtemptable(kcbm,kcmc,cj,xf,kcdlbm,kclbbm,tkcbm,tkcmc)    
       values(vkcbm,vkcmc,vcj,vxf, 'B', '0000000', NULL, NULL)     ; 
     end
     else 
     begin 
          declare t1  cursor  for 
          select b.kcbm,b.kclbbm,b.kcdlbm,( select xf  from b_kc  where b_kc.kcbm=b.kcbm) xf, ( select kcmc  from b_kc  where b_kc.kcbm=b.kcbm) kcmc 
       from b_bzjh b,t_tdkc t 
       where b.kcbm=t.kcbm  and t.tdkcbm=vkcbm  and t.zybzbm=vzybzbm 
       and t.kcbm  not  in ( select kcbm  from v_xscj  where xh=vxh) 
       and b.zybzbm=vzybzbm  and b.nd=vnd  and b.jb=vjb  and b.zfx= '1';                                         
             begin 
             open t1; 
                                            loop 
                                          fetch t1  into vtkcbm,vkclbbm,vkcdlbm,vt_xf,vtkcmc; 
                                          EXIT  WHEN t1%NOTFOUND;                 
                                          begin 
                     INSERT  INTO newtemptable(kcbm,kcmc,cj,xf,kcdlbm,kclbbm,tkcbm,tkcmc)    
                     values(vkcbm,vkcmc,vcj,vt_xf,vkcdlbm,vkclbbm,vtkcbm,vtkcmc)                
                                                             v_num_ct:=v_num_ct+1; 
                                             end    
              end loop;    
                         if v_num_ct =1  then 
          begin 
                                 INSERT  INTO newtemptable(kcbm,kcmc,cj,xf,kcdlbm,kclbbm,tkcbm,tkcmc)    
                              values(vkcbm,vkcmc,vcj,vxf, NULL, NULL, NULL, NULL) ;             
                         end ; 
                                      end  if;         
          end ;             
          CLOSE t1; 
                  end;             
              end
                          end  if
         end
         else 
         begin 
     INSERT  INTO newtemptable(kcbm,kcmc,cj,xf,kcdlbm,kclbbm,tkcbm,tkcmc)    
                  values(vkcbm,vkcmc,vcj,vxf,vkcdlbm,vkclbbm, NULL, NULL); 
         end  ;    
      end  if;    
                 END
   close t_cursor;         
     end
end
     

open pRecCur  for  select *  from newtemptable; 
end getxftjbyxh;









本文转自 yuwenhu 51CTO博客,原文链接:http://blog.51cto.com/yuwenhu/160496,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
2月前
|
存储 SQL 数据库
SQL Server存储过程的优缺点
【10月更文挑战第18天】SQL Server 存储过程具有提高性能、增强安全性、代码复用和易于维护等优点。它可以减少编译时间和网络传输开销,通过权限控制和参数验证提升安全性,支持代码共享和复用,并且便于维护和版本管理。然而,存储过程也存在可移植性差、开发和调试复杂、版本管理问题、性能调优困难和依赖数据库服务器等缺点。使用时需根据具体需求权衡利弊。
|
2月前
|
存储 SQL 缓存
SQL Server存储过程的优缺点
【10月更文挑战第22天】存储过程具有代码复用性高、性能优化、增强数据安全性、提高可维护性和减少网络流量等优点,但也存在调试困难、移植性差、增加数据库服务器负载和版本控制复杂等缺点。
113 1
|
2月前
|
存储 SQL 数据库
Sql Server 存储过程怎么找 存储过程内容
Sql Server 存储过程怎么找 存储过程内容
104 1
|
2月前
|
存储 SQL 数据库
SQL Server存储过程的优缺点
【10月更文挑战第17天】SQL Server 存储过程是预编译的 SQL 语句集,存于数据库中,可重复调用。它能提高性能、增强安全性和可维护性,但也有可移植性差、开发调试复杂及可能影响数据库性能等缺点。使用时需权衡利弊。
|
1月前
|
存储 Oracle 关系型数据库
oracle服务器存储过程中调用http
通过配置权限、创建和调用存储过程,您可以在Oracle数据库中使用UTL_HTTP包发起HTTP请求。这使得Oracle存储过程可以与外部HTTP服务进行交互,从而实现更复杂的数据处理和集成。在实际应用中,根据具体需求调整请求类型和错误处理逻辑,以确保系统的稳定性和可靠性。
63 0
|
2月前
|
存储 SQL 数据库
SQL Server 临时存储过程及示例
SQL Server 临时存储过程及示例
59 3
|
4月前
|
存储 SQL 数据库
如何使用 SQL Server 创建存储过程?
【8月更文挑战第31天】
227 0
|
Oracle 关系型数据库
Oracle和sqlserver数据类型对应
原文:Oracle和sqlserver数据类型对应 Sqlserver类型 Oracle类型 binary     RAW(50) bit     NUMBER(2) char     CHAR(10) datetime     DATE decimal ...
1428 0
|
SQL Oracle 关系型数据库
Oracle与SQL Server数据类型对应关系
SQL Server 数据类型 Oracle 数据类型 bigint NUMBER binary LONG RAW NOT NULL bit NUMBER (1, 0) char VARCHAR2 (900) NOT NULL datetime
1737 0
|
2月前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
192 64

推荐镜像

更多
下一篇
DataWorks