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

本文涉及的产品
云数据库 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,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
存储 Oracle 关系型数据库
Oracle存储过程插入临时表优化与慢查询解决方法
优化是一个循序渐进的过程,就像雕刻一座雕像,需要不断地打磨和细化。所以,耐心一点,一步步试验这些方法,最终你将看到那个让你的临时表插入操作如同行云流水、快如闪电的美丽时刻。
290 14
|
6月前
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
542 11
|
存储 SQL 数据库
SQL Server存储过程的优缺点
【10月更文挑战第18天】SQL Server 存储过程具有提高性能、增强安全性、代码复用和易于维护等优点。它可以减少编译时间和网络传输开销,通过权限控制和参数验证提升安全性,支持代码共享和复用,并且便于维护和版本管理。然而,存储过程也存在可移植性差、开发和调试复杂、版本管理问题、性能调优困难和依赖数据库服务器等缺点。使用时需根据具体需求权衡利弊。
300 1
|
8月前
|
存储 关系型数据库 MySQL
【YashanDB知识库】MySQL返回结果集的存储过程的改写方法
本文介绍了将MySQL存储过程改写至YashanDB的解决方案。由于MySQL存储过程可直接返回结果集,而YashanDB需通过返回SYS_REF_CURSOR的函数实现类似功能,因此需要对代码进行转换。示例中展示了如何将MySQL存储过程`proc1`改写为YashanDB函数,并调整JDBC应用代码以适配REF_CURSOR输出参数,从而正确获取查询结果。此方法确保了跨数据库场景下的兼容性与功能性。
|
存储 SQL 缓存
SQL Server存储过程的优缺点
【10月更文挑战第22天】存储过程具有代码复用性高、性能优化、增强数据安全性、提高可维护性和减少网络流量等优点,但也存在调试困难、移植性差、增加数据库服务器负载和版本控制复杂等缺点。
475 1
|
存储 SQL 数据库
SQL Server存储过程的优缺点
【10月更文挑战第17天】SQL Server 存储过程是预编译的 SQL 语句集,存于数据库中,可重复调用。它能提高性能、增强安全性和可维护性,但也有可移植性差、开发调试复杂及可能影响数据库性能等缺点。使用时需权衡利弊。
249 3
|
存储 SQL 数据库
Sql Server 存储过程怎么找 存储过程内容
Sql Server 存储过程怎么找 存储过程内容
674 1
|
存储 Oracle 关系型数据库
oracle服务器存储过程中调用http
通过配置权限、创建和调用存储过程,您可以在Oracle数据库中使用UTL_HTTP包发起HTTP请求。这使得Oracle存储过程可以与外部HTTP服务进行交互,从而实现更复杂的数据处理和集成。在实际应用中,根据具体需求调整请求类型和错误处理逻辑,以确保系统的稳定性和可靠性。
591 0
|
2月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
359 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。

热门文章

最新文章

推荐镜像

更多