Plsql 返回序列ID列表的存储过程
我需要一个小的存储过程来执行以下逻辑 varchar250中的过程名称,int中的块计数,返回ID 从1到块计数的循环 return_id:=从dual中选择'seq_name'| |.nextVal; 端环 返回标识Plsql 返回序列ID列表的存储过程,plsql,oracle9i,Plsql,Oracle9i,我需要一个小的存储过程来执行以下逻辑 varchar250中的过程名称,int中的块计数,返回ID 从1到块计数的循环 return_id:=从dual中选择'seq_name'| |.nextVal; 端环 返回标识 基本上,我想做的是有一个存储过程,让我传入一个序列名,我需要多少个ID,并将生成的ID列表返回给我,我可以在JAVA中使用这些ID。对我来说,这样做的原因是返回我可以在JAVA中使用的ID列表,并且没有其他人使用这些序列ID。之后,它们将用于其他批量插入。本质上,保留一个序列ID
基本上,我想做的是有一个存储过程,让我传入一个序列名,我需要多少个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,这正是我所需要的!同样有帮助的是,我使用了表类型的方式,但我将尝试这种方式,看看它是否会有所不同。谢谢大家!