Sp根据对表

时间:2015-09-17 19:56:23

标签: sql oracle plsql sequence

我正在处理一个接受两个输入的过程(ID(例如。12345),要输出的批号的数量(例如。5))

输出序列中的值(??)或其他一些返回值(例如,' 01',' 02',' 03&#39 ;,' 04',' 05')。

该输出基于对表中新的batch_id列的查找,该列默认初始值为' 1'在alter之后(并且是已经有ID列的同一个表)。当客户端应用程序一直呼叫SP时,此列会增加到每个ID(' 0534')的最后一个输出(' 05')的最大值。我有以下代码来使用序列来获取下一个批号:

select btchnum_seq.nextval seq_num
from dual 
connect by level <= in_total_batches;

其中in_total_batches是上面提到的param中的第二个。

  1. 如何将表格中的列与上次运行后实际持有最大值的列相关联?
  2. 我将如何输出这5个值?作为一个字符串?如果上面的选择是在光标中,我将如何显示记录?
  3. 如何获取输出的最大值并将表格列更新为最后的值?
  4. 谢谢大家。

1 个答案:

答案 0 :(得分:0)

听起来你想要这样的东西(未经测试)。如果您曾在多用户环境中使用此功能,请注意您可能会获得在不同会话中返回的相同值,并且您可能会在调用后多次返回相同的值。

create table batch (
  batch_id integer primary key,
  last_val integer not null
);

insert into batch( batch_id, last_val )
  values( 12345, 0 );

create procedure get_next_values( p_batch_id IN batch.batch_id%type,
                                  p_num_vals IN integer,
                                  p_values  OUT varchar2 )
as
  l_start_val integer;
begin
  select last_val
    into l_start_val
    from batch
   where batch_id = p_batch_id;

  update batch
     set last_val = last_val + p_num_vals
   where batch_id = p_batch_id;

  select listagg( last_val + level, ',' )
           within group( order by level )
    into p_values
    from dual
 connect by level <= p_num_vals;
end;