我需要一点存储过程来执行以下逻辑?
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。
答案 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比让应用程序使用数据库中定义的表类型更容易。