gpt4 book ai didi

oracle - 按一定数量递增 Oracle 序列

转载 作者:行者123 更新时间:2023-12-04 16:55:36 24 4
gpt4 key购买 nike

我正在编写一个 Windows 应用程序(在 Qt 4.6 中),它在某个时候将 1 到 76000 之间的任意数量的数据集插入到某个 oracle (10.2) 表中。应用程序必须从序列中检索主键,或者至少是主键范围。然后它将 ID 存储在一个列表中,该列表用于批量执行准备好的查询。

(注意:不应使用触发器,其他任务也使用该序列)

为了避免调用序列 X 次,我想将序列增加 X。

到目前为止,我发现以下代码可以在过程中使用:

ALTER SEQUENCE my_sequence INCREMENT BY X;

SELECT my_sequence.CURVAL + 1, my_sequence.NEXTVAL
INTO v_first_number, v_last_number
FROM dual;

ALTER SEQUENCE my_sequence INCREMENT BY 1;

不过,我有两个主要问题:
  • 我已经读过 ALTER SEQUENCE 会产生一个隐式提交。这是否意味着将由 Windows 应用程序启动的事务将被提交?如果是这样,你能以某种方式避免它吗?
  • 这个概念是多用户证明吗?或者可能会发生以下事情:
    Sequence is at 10,000
    Session A sets increment to 2,000
    Session A selects 10,001 as first and 12,000 as last
    Session B sets increment to 5,000
    Session A sets increment to 1
    Session B selects 12,001 as first and 12,001 as last
    Session B sets increment to 1

    即使该过程相当快,但在我的应用程序中,两个不同的用户导致该过程几乎同时被调用也不太可能
  • 最佳答案

    1) ALTER SEQUENCE是 DDL,因此它在语句之前和之后隐式提交。由 Windows 应用程序启动的数据库事务将被提交。如果您使用的是 Oracle 数据库以外的分布式事务协调器,则希望事务协调器将提交整个分布式事务,但事务协调器有时会遇到它不知道的提交问题。
    您无法阻止 DDL 提交。

    2)您为多个用户概述的场景很有可能。所以听起来这种方法在您的环境中表现不正确。

    您可能会使用 DBMS_LOCK包以确保在任何时间点只有一个 session 正在调用您的过程,然后从单个 SQL 语句调用序列 N 次。但是,如果其他进程也在使用该序列,则无法保证您将获得一组连续的值。

    CREATE PROCEDURE some_proc( p_num_rows IN NUMBER,
    p_first_val OUT NUMBER,
    p_last_val OUT NUMBER )
    AS
    l_lockhandle VARCHAR2(128);
    l_lock_return_code INTEGER;
    BEGIN
    dbms_lock.allocate_unique( 'SOME_PROC_LOCK',
    l_lockhandle );
    l_lock_return_code := dbms_lock.request( lockhandle => l_lockhandle,
    lockmode => dbms_lock.x_mode,
    release_on_commit => true );
    if( l_lock_return_code IN (0, 4) ) -- Success or already owned
    then
    <<do something>>
    end if;

    dbms_lock.release( l_lockhandle );
    END;

    关于oracle - 按一定数量递增 Oracle 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6548612/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com