存储过程以返回序列ID列表

时间:2010-12-01 16:00:59

标签: plsql oracle9i

我需要一点存储过程来执行以下逻辑?

procedure_name(seq_name IN varchar2(50),block_count IN int,return_ids OUT)

循环从1到block_count
   return_ids:=从双重选择'seq_name'|| .nextVal;
结束循环
return return_ids

基本上我想要做的是有一个存储过程,它允许我传递一个序列名称,我需要多少ID,并返回给我生成的ID,我可以在JAVA中使用。为我这样做的原因是返回我可以在JAVA中使用的ID列表,而没有其他人使用这些序列ID。它们将在以后的某些其他批量插入物中使用。实质上,保留一串序列ID。

5 个答案:

答案 0 :(得分:3)

这是从PL / SQL过程返回数组的一种方法。

创建一个集合类型的数字,在您的过程中初始化它并用数字填充它以返回。例如:

create or replace type narray as table of number;

create or replace procedure get_seq_ids(seq_name in varchar2, 
    block_count in number, return_ids out narray)
as
begin
    return_ids := narray();
    return_ids.extend(block_count);
    for i in 1 .. block_count
    loop
        execute immediate 'select ' || seq_name || '.nextval from dual' 
            into return_ids(i);
    end loop;
end;
/

答案 1 :(得分:1)

我会担心在将记录插入数据库之前需要生成ID的逻辑。

或者,您可能需要先考虑插入行,从行中选择ID,然后使用update语句执行批量操作。然而,这仍然不如Java代码在准备好插入实际信息之前不依赖于ID。

您可以将信息推送到XML(或数据库可以理解的任何其他数据格式),然后调用存储过程来执行批量插入。

答案 2 :(得分:1)

另一种选择可能是使用RETURNING子句在插入后自动返回序列值。

答案 3 :(得分:0)

恕我直言,您可以做的最好的事情就是在sequence_name.nextval条款的INSERT INTO中直接引用VALUES

你说你想避免其他人使用相同的ID。引用this site

  

序列(或Oracle,就此而言)确保同一会话中没有其他会话或其他对nextval的调用从序列中获得相同的数字。

因此,Oracle中保证了序列号的唯一性。

答案 4 :(得分:0)

这是我为我支持的Java应用程序所做的工作(也使用批量插入到深层次表中)

PROCEDURE get_nextvals
( 
    p_values OUT SYS_REFCURSOR,
    p_count  IN  PLS_INTEGER
)
IS
    -- return the next p_count values from the PK sequence
BEGIN
    OPEN p_values FOR
        SELECT
            <schema>.<sequence>.nextval
        FROM
            dual
        CONNECT BY
            LEVEL <= p_count
    ;
END;

将光标传递给java比让应用程序使用数据库中定义的表类型更容易。