加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 15:38:55 所属栏目:MsSql教程 来源:网络整理
导读:一同学叫我帮忙改存储过程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 encryp
一同学叫我帮忙改存储过程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,
????@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,
????xf decimal(4,
??????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,'B','0000000',NULL,NULL)????????
???? end
???? else
???? begin
???????? declare t1 cursor for
???????? select b.kcbm,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,@t_xf,@tkcmc
???????? if @@FETCH_STATUS=0
???????? begin
???????????????? while @@FETCH_STATUS=0
???????????????????????????????????????????? begin
???????????????????? INSERT INTO @ temp(kcbm,tkcmc)????
???????????????????? values(@kcbm,@tkcbm,@tkcmc)????????
???????????????????????????????? fetch next from t1
???????????????????????????????????????????????? into @tkcbm,@tkcmc????
???????????????????????????????????????????? end????
???????? end????
???????????????????????? else
???????? begin
???????????????????????????????? INSERT INTO @ temp(kcbm,tkcmc)????
???????????????????????????? values(@kcbm,NULL)????????????????
???????????????????????? end????????????
???????? CLOSE t1
???????????? DEALLOCATE t1????????
???? end
???????? end
???????? else
???????? begin
???? INSERT INTO @ temp(kcbm,tkcmc)????
???????????????? values(@kcbm,NULL)
???????? end????
???????? FETCH NEXT FROM t_cursor????
???? INTO @kcbm,@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,
xf number(4,
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,( 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,tkcmc)????
?????? values(vkcbm,vkcmc,NULL)???? ;
???? end;
???? else
???? begin
???????? declare t1 cursor for
???????? select b.kcbm,( 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,vt_xf,vtkcmc;
???????????????????????????????????????? EXIT WHEN t1%NOTFOUND;????????????????
???????????????????????????????????????? begin
???????????????????? INSERT INTO newtemptable(kcbm,tkcmc)????
???????????????????? values(vkcbm,vtkcbm,vtkcmc)????????????????
???????????????????????????????????????????????????????????? v_num_ct:=v_num_ct+1;
???????????????????????????????????????????? end????
???????????? end loop;????
???????????????????????? if v_num_ct =1 then
???????? begin
???????????????????????????????? INSERT INTO newtemptable(kcbm,tkcmc)????
???????????????????????????? values(vkcbm,NULL) ;????????????
???????????????????????? end ;
???????????????????????????????????? end if;????????
???????? end ;????????????
???????? CLOSE t1;
???????????????? end;????????????
???????????? end;
???????????????????????? end if;
???????? end;
???????? else
???????? begin
???? INSERT INTO newtemptable(kcbm,tkcmc)????
???????????????? values(vkcbm,NULL);
???????? end??;????
???? end if;????
???????????????? END;
?? close t_cursor;????????
???? end;
end;
????

open pRecCur for select * from newtemptable;
end getxftjbyxh;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读