Plsql 返回序列ID列表的存储过程

Plsql 返回序列ID列表的存储过程,plsql,oracle9i,Plsql,Oracle9i,我需要一个小的存储过程来执行以下逻辑 varchar250中的过程名称,int中的块计数,返回ID 从1到块计数的循环 return_id:=从dual中选择'seq_name'| |.nextVal; 端环 返回标识 基本上,我想做的是有一个存储过程,让我传入一个序列名,我需要多少个ID,并将生成的ID列表返回给我,我可以在JAVA中使用这些ID。对我来说,这样做的原因是返回我可以在JAVA中使用的ID列表,并且没有其他人使用这些序列ID。之后,它们将用于其他批量插入。本质上,保留一个序列ID

我需要一个小的存储过程来执行以下逻辑

varchar250中的过程名称,int中的块计数,返回ID 从1到块计数的循环 return_id:=从dual中选择'seq_name'| |.nextVal; 端环 返回标识


基本上,我想做的是有一个存储过程,让我传入一个序列名,我需要多少个ID,并将生成的ID列表返回给我,我可以在JAVA中使用这些ID。对我来说,这样做的原因是返回我可以在JAVA中使用的ID列表,并且没有其他人使用这些序列ID。之后,它们将用于其他批量插入。本质上,保留一个序列ID块

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

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


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

这里有一种从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;
/

IMHO,您可以做的最好的事情就是在INSERT INTO的VALUES子句中引用sequence_name.nextval

你说你想避免其他人使用相同的ID。参考:

就这一点而言,sequence或Oracle确保同一会话中的其他会话或对nextval的其他调用不会从序列中获得相同的号码


因此,序列号的唯一性在Oracle中是有保证的。

下面是我为我支持的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比让应用程序使用DB中定义的表类型更容易。

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

好,如果我有DBA支持,那么我更愿意将数组传递给一个过程,让它们处理DB端的所有插入。但由于我没有支持…我正在尝试将大量记录插入到相关的分层表中。因为我需要顶级表中的ID,所以我可以将它插入到第二级表中,然后插入到第三级和第四级表中,依此类推。我也不想在每次插入时使用JDBC调用DB来获取ID。我只想预取一个SEQ_id块,我可以用它填充各种数组,这样我就可以在批插入中使用这些数组。我对你关于没有DBA支持的评论感到困惑。您可以编写一个存储过程来保留ID,但不能编写一个存储过程来使用正确的ID插入每个表?这不是一个不寻常的问题。Java提供了一个批处理命令,该命令在一次调用中发出DML操作列表。利用这一点的唯一方法是提前获取ID,以便在插入任何行之前可以指定所有外键引用Java批处理命令的好处是什么?我可以用XML“批处理”命令,而不是数组来进行一次调用。问题是对于出于性能原因希望批处理DML操作的应用程序,将下一次调用保留在INSERT中意味着在插入任何子记录之前进行后续查询以获取该ID。对于一个需要保存很多行的应用程序,这需要与DB进行大量的来回对话。谢谢vls,这正是我所需要的!同样有帮助的是,我使用了表类型的方式,但我将尝试这种方式,看看它是否会有所不同。谢谢大家!