我是想实现这样的:
两个游标curosr1、cursor2分别是查询两张不同的表tab1,tab2(都有相同的两个非主键字段:'商品ID'和'数量')。我用嵌套loop分别循环tab1和tab2,若curosr1的当前列与cursor2当前列满足某种条件(比如段'商品ID'相同),则修改curosr1当前列的'数量'(但不修改数据库),我现在想把修改后的记录列表(是列表,不是单挑记录,这些记录只是在前台给用户预览的,不要修改数据库)返回
,我应该怎么实现?这里是不是不能用游标实现(游标一旦重置的话,其修改过的行数据也就还原了)?应该用到哪些东西?我是oracle的初学者,项目要求把大部分业务逻辑放到oracle中,希望大家给我指点思路,当然越详细越好。先说声谢谢!

解决方案 »

  1.   

    如果你的前台是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;
    /
      

  2.   

    为何不用一个sql写出来直接返回,还要分成2个游标处理?
      

  3.   


    看来crazylaa也是做的关于短,彩信得项目。呵呵
      

  4.   

    OK,多谢大家的教导!可以结贴了!
    shiyiwan说的一条sql搞定,但自己能力有限,以后再尝试。