oracle怎样返回修改后的记录列表

玄冬Wong 2009-12-30 11:31:00
我是想实现这样的:
两个游标curosr1、cursor2分别是查询两张不同的表tab1,tab2(都有相同的两个非主键字段:'商品ID'和'数量')。我用嵌套loop分别循环tab1和tab2,若curosr1的当前列与cursor2当前列满足某种条件(比如段'商品ID'相同),则修改curosr1当前列的'数量'(但不修改数据库),我现在想把修改后的记录列表(是列表,不是单挑记录,这些记录只是在前台给用户预览的,不要修改数据库)返回
,我应该怎么实现?这里是不是不能用游标实现(游标一旦重置的话,其修改过的行数据也就还原了)?应该用到哪些东西?我是oracle的初学者,项目要求把大部分业务逻辑放到oracle中,希望大家给我指点思路,当然越详细越好。先说声谢谢!
...全文
224 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bf234511171 2011-03-04
  • 打赏
  • 举报
回复
受益匪浅谢谢啊
碧水幽幽泉 2010-01-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sql_xep 的回复:]
嗯  用嵌套表  和 数组  可行  而且速度还快


[/Quote]
同意使用嵌套表或数组解决!
玄冬Wong 2010-01-03
  • 打赏
  • 举报
回复
OK,多谢大家的教导!可以结贴了!
shiyiwan说的一条sql搞定,但自己能力有限,以后再尝试。
duqiangcise 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 crazylaa 的回复:]
如果你的前台是java,那么这种方式完全可以;如果是其他编程语言,请参照oracle官方文档相应修改。
附返回对象数组(自定义对象存储在index by 表中,通用的可以理解为对象数组)的存储过程,没有照你的方式,是因为业务与你想要返回的数据无关,按业务,参照下面存储过程中组织那个lst的方式来组织你的数据就可以:

SQL codedrop type t_sms_message_lst;drop type t_sms_message;--此类型中,添加了pk_idcreateorreplace type t_sms_messageas object (
task_idnumber(32),
sender_numvarchar2(21),
mobile_novarchar2(21),
param_valuevarchar2(900),
pk_idnumber(32)
);/createorreplace type t_sms_message_lstastableof t_sms_message;/dropprocedure proc_sel_sms_message;createorreplaceprocedure proc_sel_sms_message(
in_task_idINnumber,
in_countINnumber,
out_sms_message_lst OUT t_sms_message_lst,
out_ret OUTnumber
)as
var_cr_sms_message SYS_REFCURSOR;

var_m_row_idvarchar2(1000);
var_m_task_id sms_message.task_id%TYPE;
var_m_sender_num sms_message.sender_num%TYPE;
var_m_mobile_no sms_message.mobile_no%TYPE;
var_m_param_value sms_message.param_value%TYPE;
var_m_last_send_time sms_message.last_send_time%TYPE;

var_t_sms_message t_sms_message;
var_total_send_amountinteger;begin--查询语句增加了pk_id搜索项open var_cr_sms_messageforselect rowidas row_id,task_id,sender_num,mobile_no,param_value,pk_idfrom sms_messagewhere task_id= in_task_idand last_send_timeisnulland rownum<= in_countforupdate;

out_sms_message_lst := t_sms_message_lst();select last_send_timeinto var_m_last_send_timefrom sms_taskwhere task_id= in_task_id;

loop--fetch语句增加了pk_id项fetch var_cr_sms_messageinto var_m_row_id,var_m_task_id,var_m_sender_num,var_m_mobile_no,var_m_param_value,var_m_pk_id;exitwhen var_cr_sms_message%NOTFOUND;--输出对象类型中增加了pk_id项 var_t_sms_message := t_sms_message(var_m_task_id,var_m_sender_num,var_m_mobile_no,var_m_param_value,var_m_pk_id);
out_sms_message_lst.extend;
out_sms_message_lst(out_sms_message_lst.count) := var_t_sms_message;update sms_messageset last_send_time= var_m_last_send_timewhere rowid= var_m_row_id;end loop;close var_cr_sms_message;

out_ret :=0;

exceptionwhen othersthenbegin
out_ret :=-1;
raise;end;end proc_sel_sms_message;/


[/Quote]

看来crazylaa也是做的关于短,彩信得项目。呵呵
zhangwonderful 2009-12-31
  • 打赏
  • 举报
回复
建议使用数组方式。
KnowKjava 2009-12-31
  • 打赏
  • 举报
回复
数组返回
sql_xeppp 2009-12-31
  • 打赏
  • 举报
回复
嗯 用嵌套表 和 数组 可行 而且速度还快

crazylaa 2009-12-31
  • 打赏
  • 举报
回复
如果你的前台是java,那么这种方式完全可以;如果是其他编程语言,请参照oracle官方文档相应修改。
附返回对象数组(自定义对象存储在index by 表中,通用的可以理解为对象数组)的存储过程,没有照你的方式,是因为业务与你想要返回的数据无关,按业务,参照下面存储过程中组织那个lst的方式来组织你的数据就可以:

drop type t_sms_message_lst;
drop type t_sms_message;

--此类型中,添加了pk_id
create or replace type t_sms_message as object (
task_id number(32),
sender_num varchar2(21),
mobile_no varchar2(21),
param_value varchar2(900),
pk_id number(32)
);
/

create or replace type t_sms_message_lst as table of t_sms_message;
/

drop procedure proc_sel_sms_message;

create or replace procedure proc_sel_sms_message(
in_task_id IN number,
in_count IN number,
out_sms_message_lst OUT t_sms_message_lst,
out_ret OUT number
)as
var_cr_sms_message SYS_REFCURSOR;

var_m_row_id varchar2(1000);
var_m_task_id sms_message.task_id%TYPE;
var_m_sender_num sms_message.sender_num%TYPE;
var_m_mobile_no sms_message.mobile_no%TYPE;
var_m_param_value sms_message.param_value%TYPE;
var_m_last_send_time sms_message.last_send_time%TYPE;

var_t_sms_message t_sms_message;
var_total_send_amount integer;

begin

--查询语句增加了pk_id搜索项
open var_cr_sms_message for
select rowid as row_id,task_id,sender_num,mobile_no,param_value,pk_id
from sms_message
where task_id = in_task_id
and last_send_time is null
and rownum <= in_count
for update;

out_sms_message_lst := t_sms_message_lst();

select last_send_time into var_m_last_send_time from sms_task where task_id = in_task_id;

loop
--fetch语句增加了pk_id项
fetch var_cr_sms_message into var_m_row_id,var_m_task_id,var_m_sender_num,var_m_mobile_no,var_m_param_value,var_m_pk_id;
exit when var_cr_sms_message%NOTFOUND;

--输出对象类型中增加了pk_id项
var_t_sms_message := t_sms_message(var_m_task_id,var_m_sender_num,var_m_mobile_no,var_m_param_value,var_m_pk_id);
out_sms_message_lst.extend;
out_sms_message_lst(out_sms_message_lst.count) := var_t_sms_message;

update sms_message set last_send_time = var_m_last_send_time
where rowid = var_m_row_id;

end loop;

close var_cr_sms_message;

out_ret := 0;

exception when others then
begin
out_ret := -1;
raise;
end;
end proc_sel_sms_message;
/



crazylaa 2009-12-31
  • 打赏
  • 举报
回复
用数组返回即可。
shiyiwan 2009-12-31
  • 打赏
  • 举报
回复
为何不用一个sql写出来直接返回,还要分成2个游标处理?

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧