سؤال

في PostgreSQL, ، يمكنني أن أفعل شيئًا كهذا:

ALTER SEQUENCE serial RESTART WITH 0;

هل هناك ما يعادل أوراكل؟

هل كانت مفيدة؟

المحلول

فيما يلي إجراء جيد لإعادة تعيين أي تسلسل إلى 0 من خبير Oracle توم كايت.مناقشة رائعة حول الإيجابيات والسلبيات في الروابط أدناه أيضًا.

tkyte@TKYTE901.US.ORACLE.COM> 
create or replace
procedure reset_seq( p_seq_name in varchar2 )
is
    l_val number;
begin
    execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_val;

    execute immediate
    'alter sequence ' || p_seq_name || ' increment by -' || l_val || 
                                                          ' minvalue 0';

    execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_val;

    execute immediate
    'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
end;
/

من هذه الصفحة: SQL الديناميكي لإعادة تعيين قيمة التسلسل
مناقشة جيدة أخرى هنا أيضًا: كيفية إعادة ضبط التسلسل؟

نصائح أخرى

إعادة التشغيل الحقيقية غير ممكنة بقدر ما أعلم.(أرجوا أن تصحح لي إذا كنت مخطئا!).

ومع ذلك، إذا كنت تريد تعيينه على 0، فيمكنك فقط حذفه وإعادة إنشائه.

إذا كنت ترغب في تعيينها على قيمة محددة، يمكنك ضبط الزيادة على قيمة سالبة والحصول على القيمة التالية.

أي أنه إذا كان التسلسل الخاص بك عند 500، فيمكنك ضبطه على 100 عبر

ALTER SEQUENCE serial INCREMENT BY -400;
SELECT serial.NEXTVAL FROM dual;
ALTER SEQUENCE serial INCREMENT BY 1;

هذا هو نهجي:

  1. إسقاط التسلسل
  2. أعد إنشائه

مثال:

--Drop sequence

DROP SEQUENCE MY_SEQ;

-- Create sequence 

create sequence MY_SEQ
minvalue 1
maxvalue 999999999999999999999
start with 1
increment by 1
cache 20;

نهجي هو امتداد صغير ل مثال دوغمان.

الامتدادات هي...

قم بتمرير القيمة الأولية كمعلمة.لماذا؟أحب أن أسمي الشيء الذي يعيد ضبط التسلسل مرة أخرى الحد الأقصى للمعرف المستخدم في بعض الجداول.انتهى بي الأمر باستدعاء هذا proc من برنامج نصي آخر ينفذ مكالمات متعددة لمجموعة كاملة من التسلسلات، وإعادة تعيين nextval مرة أخرى إلى مستوى معين مرتفع بما يكفي لعدم التسبب في حدوث انتهاكات للمفتاح الأساسي حيث أستخدم قيمة التسلسل لمعرف فريد.

كما أنه يكرم السابق القيمة الدنيا.يجوز في الواقع ادفع القيمة التالية إلى أعلى من أي وقت مضى إذا كان المطلوب p_val أو القيمة الدنيا الموجودة أعلى من القيمة التالية الحالية أو المحسوبة.

وأفضل ما في الأمر هو أنه يمكن استدعاؤه لإعادة التعيين إلى قيمة محددة، والانتظار حتى ترى الإجراء المجمّع "إصلاح جميع تسلسلاتي" في النهاية.

create or replace
procedure Reset_Sequence( p_seq_name in varchar2, p_val in number default 0)
is
  l_current number := 0;
  l_difference number := 0;
  l_minvalue user_sequences.min_value%type := 0;

begin

  select min_value
  into l_minvalue
  from user_sequences
  where sequence_name = p_seq_name;

  execute immediate
  'select ' || p_seq_name || '.nextval from dual' INTO l_current;

  if p_Val < l_minvalue then
    l_difference := l_minvalue - l_current;
  else
    l_difference := p_Val - l_current;
  end if;

  if l_difference = 0 then
    return;
  end if;

  execute immediate
    'alter sequence ' || p_seq_name || ' increment by ' || l_difference || 
       ' minvalue ' || l_minvalue;

  execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_difference;

  execute immediate
    'alter sequence ' || p_seq_name || ' increment by 1 minvalue ' || l_minvalue;
end Reset_Sequence;

يعد هذا الإجراء مفيدًا في حد ذاته، ولكن الآن دعونا نضيف إجراءً آخر يستدعيه ويحدد كل شيء برمجيًا باستخدام اصطلاح تسمية التسلسل والبحث عن الحد الأقصى للقيمة المستخدمة في جدول/حقل موجود...

create or replace
procedure Reset_Sequence_to_Data(
  p_TableName varchar2,
  p_FieldName varchar2
)
is
  l_MaxUsed NUMBER;
BEGIN

  execute immediate
    'select coalesce(max(' || p_FieldName || '),0) from '|| p_TableName into l_MaxUsed;

  Reset_Sequence( p_TableName || '_' || p_Fieldname || '_SEQ', l_MaxUsed );

END Reset_Sequence_to_Data;

الآن نحن نطبخ بالغاز!

سيتحقق الإجراء أعلاه من القيمة القصوى للحقل في الجدول، ويبني اسم تسلسل من زوج الجدول/الحقل ويستدعي "إعادة تعيين_التسلسل" مع تلك القيمة القصوى المحسوسة.

القطعة الأخيرة في هذا اللغز والزينة على الكعكة تأتي بعد ذلك...

create or replace
procedure Reset_All_Sequences
is
BEGIN

  Reset_Sequence_to_Data( 'ACTIVITYLOG', 'LOGID' );
  Reset_Sequence_to_Data( 'JOBSTATE', 'JOBID' );
  Reset_Sequence_to_Data( 'BATCH', 'BATCHID' );

END Reset_All_Sequences;

في قاعدة البيانات الفعلية الخاصة بي، هناك حوالي مائة تسلسل آخر يتم إعادة تعيينه من خلال هذه الآلية، لذلك هناك 97 استدعاءًا إضافيًا Reset_Sequence_to_Data في هذا الإجراء أعلاه.

أحبها؟اكرهها؟غير مبال؟

alter sequence serial restart start with 0;

هذه الميزة جديدة في Oracle 12c.إنها لا المدرجة في الوثائق الرسمية.لقد وجدته في البرامج النصية التي تم إنشاؤها بواسطة حزمة Oracle DBMS_METADATA_DIFF.

تحذير: لقد استخدمت هذه الميزة عدة مرات في أنظمة الإنتاج وفي رأيي أنه من الجيد استخدام هذا الأمر في البرامج النصية المخصصة.ولكن قد لا ترغب في تضمينه في الإجراء كجزء من التطبيق.لقد قمت بإنشاء طلب خدمة أوراكل للاستفسار عن هذه الميزة؛إنه ليس مجرد خطأ في التوثيق، بل هو ميزة غير مدعومة.من الممكن أن يختفي الأمر يومًا ما، مثل WM_CONCAT.(على الرغم من أنني أعتقد أن هذا غير مرجح - نادرًا ما يختفي بناء جملة Oracle، وهي ميزة بسيطة تستخدم داخليًا في مكانين على الأقل.)

يقوم البرنامج النصي التالي بتعيين التسلسل إلى القيمة المطلوبة:

بالنظر إلى تسلسل تم إنشاؤه حديثًا باسم PCS_PROJ_KEY_SEQ والجدول PCS_PROJ:

BEGIN
   DECLARE
      PROJ_KEY_MAX       NUMBER := 0;
      PROJ_KEY_CURRVAL   NUMBER := 0;
   BEGIN

    SELECT MAX (PROJ_KEY) INTO PROJ_KEY_MAX FROM PCS_PROJ;
    EXECUTE IMMEDIATE 'ALTER SEQUENCE PCS_PROJ_KEY_SEQ INCREMENT BY ' || PROJ_KEY_MAX;
    SELECT PCS_PROJ_KEY_SEQ.NEXTVAL INTO PROJ_KEY_CURRVAL FROM DUAL;
    EXECUTE IMMEDIATE 'ALTER SEQUENCE PCS_PROJ_KEY_SEQ INCREMENT BY 1';

END;
END;
/

هذا الإجراء المخزن يعيد تشغيل التسلسل الخاص بي:

Create or Replace Procedure Reset_Sequence  
  is
  SeqNbr Number;
begin
   /*  Reset Sequence 'seqXRef_RowID' to 0    */
   Execute Immediate 'Select seqXRef.nextval from dual ' Into SeqNbr;
   Execute Immediate 'Alter sequence  seqXRef increment by - ' || TO_CHAR(SeqNbr) ;
   Execute Immediate 'Select seqXRef.nextval from dual ' Into SeqNbr;
   Execute Immediate 'Alter sequence  seqXRef increment by 1';
END;

/

هناك طريقة أخرى لإعادة تعيين التسلسل في Oracle:تعيين maxvalue و cycle ملكيات.عندما nextval من التسلسل يضرب maxvalue, ، إذا كان cycle تم تعيين الخاصية ثم سيبدأ مرة أخرى من minvalue من التسلسل.

وميزة هذه الطريقة مقارنة بوضع سلبي increment by هو أنه يمكن الاستمرار في استخدام التسلسل أثناء تشغيل عملية إعادة التعيين، مما يقلل من فرصة احتياجك إلى حدوث شكل من أشكال الانقطاع للقيام بإعادة التعيين.

القيمة ل maxvalue يجب أن يكون أكبر من الحالي nextval, ، لذا يتضمن الإجراء أدناه معلمة اختيارية تسمح بوجود مخزن مؤقت في حالة الوصول إلى التسلسل مرة أخرى بين تحديد nextval في الإجراء وتحديد cycle ملكية.

create sequence s start with 1 increment by 1;

select s.nextval from dual
connect by level <= 20;

   NEXTVAL
----------
         1 
...
        20

create or replace procedure reset_sequence ( i_buffer in pls_integer default 0)
as
  maxval pls_integer;
begin

  maxval := s.nextval + greatest(i_buffer, 0); --ensure we don't go backwards!
  execute immediate 'alter sequence s cycle minvalue 0 maxvalue ' || maxval;
  maxval := s.nextval;
  execute immediate 'alter sequence s nocycle maxvalue 99999999999999';

end;
/
show errors

exec reset_sequence;

select s.nextval from dual;

   NEXTVAL
----------
         1 

الإجراء كما هو لا يزال يسمح بإمكانية جلب جلسة أخرى القيمة 0، والتي قد تكون أو لا تكون مشكلة بالنسبة لك.إذا كان الأمر كذلك، فيمكنك دائمًا:

  • تعيين minvalue 1 في التغيير الأول
  • استبعاد الثاني nextval أحضر
  • انقل البيان لتعيين nocycle الخاصية إلى إجراء آخر، ليتم تشغيله في وقت لاحق (على افتراض أنك تريد القيام بذلك).

يا جيسوس، كل هذه البرمجة من أجل إعادة تشغيل الفهرس فقط...ربما أنا أحمق، ولكن بالنسبة لما قبل أوراكل 12 (الذي يحتوي على ميزة إعادة التشغيل)، ما هو الخطأ في البساطة:

drop sequence blah;
create sequence blah 

?

1) لنفترض أنك قمت بإنشاء SEQUENCE كما هو موضح أدناه:

CREATE SEQUENCE TESTSEQ
INCREMENT BY 1
MINVALUE 1
MAXVALUE 500
NOCACHE
NOCYCLE
NOORDER

2) الآن يمكنك جلب القيم من SEQUENCE.لنفترض أنني جلبت أربع مرات كما هو موضح أدناه.

SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual

3) بعد تنفيذ الأوامر الأربعة المذكورة أعلاه، ستكون قيمة التسلسل 4.لنفترض الآن أنني قمت بإعادة تعيين قيمة SEQUENCE إلى 1 مرة أخرى.اتبع الخطوات التالية.اتبع جميع الخطوات بنفس الترتيب كما هو موضح أدناه:

  1. ALTER SEQUENCE TESTSEQ INCREMENT BY -3;
  2. SELECT TESTSEQ.NEXTVAL FROM dual
  3. ALTER SEQUENCE TESTSEQ INCREMENT BY 1;
  4. SELECT TESTSEQ.NEXTVAL FROM dual

يعد تغيير قيمة INCREMENT الخاصة بالتسلسل، وزيادتها، ثم تغييرها مرة أخرى أمرًا غير مؤلم إلى حد كبير، بالإضافة إلى أن لديك فائدة إضافية تتمثل في عدم الاضطرار إلى إعادة إنشاء جميع المنح كما لو كنت قد قمت بإسقاط/إعادة إنشاء التسلسل.

أقوم بإنشاء كتلة لإعادة ضبط جميع التسلسلات الخاصة بي:

DECLARE
    I_val number;
BEGIN
    FOR US IN
        (SELECT US.SEQUENCE_NAME FROM USER_SEQUENCES US)
    LOOP
        execute immediate 'select ' || US.SEQUENCE_NAME || '.nextval from dual' INTO l_val;
        execute immediate 'alter sequence ' || US.SEQUENCE_NAME || ' increment by -' || l_val || ' minvalue 0';
        execute immediate 'select ' || US.SEQUENCE_NAME || '.nextval from dual' INTO l_val;
        execute immediate 'alter sequence ' || US.SEQUENCE_NAME || ' increment by 1 minvalue 0';
    END LOOP;
END;

فيما يلي إجراء أكثر قوة لتغيير القيمة التالية التي يتم إرجاعها بواسطة تسلسل، بالإضافة إلى الكثير.

  • أولاً، فهو يحمي من هجمات حقن SQL حيث لا يتم استخدام أي من السلاسل التي تم تمريرها لإنشاء أي من عبارات SQL الديناميكية بشكل مباشر،
  • ثانيًا، يمنع تعيين قيمة التسلسل التالية خارج حدود قيم التسلسل الأدنى أو الأقصى.ال next_value سيكون != min_value وبين min_value و max_value.
  • ثالثا يأخذ التيار (أو المقترح) increment_by الإعداد وكذلك كافة إعدادات التسلسل الأخرى في الاعتبار عند التنظيف.
  • رابعًا، جميع المعلمات باستثناء الأولى اختيارية، وما لم يتم تحديدها، فإنها تأخذ إعداد التسلسل الحالي كإعدادات افتراضية.إذا لم يتم تحديد أي معلمات اختيارية، فلن يتم اتخاذ أي إجراء.
  • أخيرًا، إذا حاولت تغيير تسلسل غير موجود (أو لا يملكه المستخدم الحالي)، فسيؤدي ذلك إلى ظهور خطأ ORA-01403: no data found خطأ.

إليك الكود:

CREATE OR REPLACE PROCEDURE alter_sequence(
    seq_name      user_sequences.sequence_name%TYPE
  , next_value    user_sequences.last_number%TYPE := null
  , increment_by  user_sequences.increment_by%TYPE := null
  , min_value     user_sequences.min_value%TYPE := null
  , max_value     user_sequences.max_value%TYPE := null
  , cycle_flag    user_sequences.cycle_flag%TYPE := null
  , cache_size    user_sequences.cache_size%TYPE := null
  , order_flag    user_sequences.order_flag%TYPE := null)
  AUTHID CURRENT_USER
AS
  l_seq user_sequences%rowtype;
  l_old_cache user_sequences.cache_size%TYPE;
  l_next user_sequences.min_value%TYPE;
BEGIN
  -- Get current sequence settings as defaults
  SELECT * INTO l_seq FROM user_sequences WHERE sequence_name = seq_name;

  -- Update target settings
  l_old_cache := l_seq.cache_size;
  l_seq.increment_by := nvl(increment_by, l_seq.increment_by);
  l_seq.min_value    := nvl(min_value, l_seq.min_value);
  l_seq.max_value    := nvl(max_value, l_seq.max_value);
  l_seq.cycle_flag   := nvl(cycle_flag, l_seq.cycle_flag);
  l_seq.cache_size   := nvl(cache_size, l_seq.cache_size);
  l_seq.order_flag   := nvl(order_flag, l_seq.order_flag);

  IF next_value is NOT NULL THEN
    -- Determine next value without exceeding limits
    l_next := LEAST(GREATEST(next_value, l_seq.min_value+1),l_seq.max_value);

    -- Grab the actual latest seq number
    EXECUTE IMMEDIATE
        'ALTER SEQUENCE '||l_seq.sequence_name
            || ' INCREMENT BY 1'
            || ' MINVALUE '||least(l_seq.min_value,l_seq.last_number-l_old_cache)
            || ' MAXVALUE '||greatest(l_seq.max_value,l_seq.last_number)
            || ' NOCACHE'
            || ' ORDER';
    EXECUTE IMMEDIATE 
      'SELECT '||l_seq.sequence_name||'.NEXTVAL FROM DUAL'
    INTO l_seq.last_number;

    l_next := l_next-l_seq.last_number-1;

    -- Reset the sequence number
    IF l_next <> 0 THEN
      EXECUTE IMMEDIATE 
        'ALTER SEQUENCE '||l_seq.sequence_name
            || ' INCREMENT BY '||l_next
            || ' MINVALUE '||least(l_seq.min_value,l_seq.last_number)
            || ' MAXVALUE '||greatest(l_seq.max_value,l_seq.last_number)
            || ' NOCACHE'
            || ' ORDER';
      EXECUTE IMMEDIATE 
        'SELECT '||l_seq.sequence_name||'.NEXTVAL FROM DUAL'
      INTO l_next;
    END IF;
  END IF;

  -- Prepare Sequence for next use.
  IF COALESCE( cycle_flag
             , next_value
             , increment_by
             , min_value
             , max_value
             , cache_size
             , order_flag) IS NOT NULL
  THEN
    EXECUTE IMMEDIATE 
      'ALTER SEQUENCE '||l_seq.sequence_name
          || ' INCREMENT BY '||l_seq.increment_by
          || ' MINVALUE '||l_seq.min_value
          || ' MAXVALUE '||l_seq.max_value
          || CASE l_seq.cycle_flag
             WHEN 'Y' THEN ' CYCLE' ELSE ' NOCYCLE' END
          || CASE l_seq.cache_size
             WHEN 0 THEN ' NOCACHE'
             ELSE ' CACHE '||l_seq.cache_size END
          || CASE l_seq.order_flag
             WHEN 'Y' THEN ' ORDER' ELSE ' NOORDER' END;
  END IF;
END;

في مشروعي، بمجرد أن حدث أن قام شخص ما بإدخال السجلات يدويًا دون استخدام التسلسل، ومن ثم لا بد لي من إعادة تعيين قيمة التسلسل يدويًا، والتي كتبت من أجلها أدناه مقتطف كود SQL:

declare
max_db_value number(10,0);
cur_seq_value number(10,0);
counter number(10,0);
difference number(10,0);
dummy_number number(10);

begin

-- enter table name here
select max(id) into max_db_value from persons;
-- enter sequence name here
select last_number into cur_seq_value from user_sequences where  sequence_name = 'SEQ_PERSONS';

difference  := max_db_value - cur_seq_value;

 for counter in 1..difference
 loop
    -- change sequence name here as well
    select SEQ_PERSONS.nextval into dummy_number from dual;
 end loop;
end;

يرجى ملاحظة أن الكود أعلاه سيعمل إذا كان التسلسل متأخرًا.

يمكنك استخدام خيار CYCLE، الموضح أدناه:

CREATE SEQUENCE test_seq
MINVALUE 0
MAXVALUE 100
START WITH 0
INCREMENT BY 1
CYCLE;

في هذه الحالة، عندما يصل التسلسل إلى MAXVALUE (100)، سيتم إعادة تدويره إلى MINVALUE (0).

في حالة وجود تسلسل متناقص، سيتم إعادة تدوير التسلسل إلى MAXVALUE.

فيما يلي كيفية جعل جميع تسلسلات الزيادة التلقائية تتطابق مع البيانات الفعلية:

  1. قم بإنشاء إجراء لفرض القيمة التالية كما تم وصفه بالفعل في هذا الموضوع:

    CREATE OR REPLACE PROCEDURE Reset_Sequence(
        P_Seq_Name IN VARCHAR2,
        P_Val      IN NUMBER DEFAULT 0)
    IS
      L_Current    NUMBER                      := 0;
      L_Difference NUMBER                      := 0;
      L_Minvalue User_Sequences.Min_Value%Type := 0;
    BEGIN
      SELECT Min_Value
      INTO L_Minvalue
      FROM User_Sequences
      WHERE Sequence_Name = P_Seq_Name;
      EXECUTE Immediate 'select ' || P_Seq_Name || '.nextval from dual' INTO L_Current;
      IF P_Val        < L_Minvalue THEN
        L_Difference := L_Minvalue - L_Current;
      ELSE
        L_Difference := P_Val - L_Current;
      END IF;
      IF L_Difference = 0 THEN
        RETURN;
      END IF;
      EXECUTE Immediate 'alter sequence ' || P_Seq_Name || ' increment by ' || L_Difference || ' minvalue ' || L_Minvalue;
      EXECUTE Immediate 'select ' || P_Seq_Name || '.nextval from dual' INTO L_Difference;
      EXECUTE Immediate 'alter sequence ' || P_Seq_Name || ' increment by 1 minvalue ' || L_Minvalue;
    END Reset_Sequence;
    
  2. قم بإنشاء إجراء آخر للتوفيق بين كافة التسلسلات والمحتوى الفعلي:

    CREATE OR REPLACE PROCEDURE RESET_USER_SEQUENCES_TO_DATA
    IS
      STMT CLOB;
    BEGIN
      SELECT 'select ''BEGIN'' || chr(10) || x || chr(10) || ''END;'' FROM (select listagg(x, chr(10)) within group (order by null) x FROM ('
        || X
        || '))'
      INTO STMT
      FROM
        (SELECT LISTAGG(X, ' union ') WITHIN GROUP (
        ORDER BY NULL) X
        FROM
          (SELECT CHR(10)
            || 'select ''Reset_Sequence('''''
            || SEQ_NAME
            || ''''','' || coalesce(max('
            || COL_NAME
            || '), 0) || '');'' x from '
            || TABLE_NAME X
          FROM
            (SELECT TABLE_NAME,
              REGEXP_SUBSTR(WTEXT, 'NEW\.(\S*) IS NULL',1,1,'i',1) COL_NAME,
              REGEXP_SUBSTR(BTEXT, '(\.|\s)([a-z_]*)\.nextval',1,1,'i',2) SEQ_NAME
            FROM USER_TRIGGERS
            LEFT JOIN
              (SELECT NAME BNAME,
                TEXT BTEXT
              FROM USER_SOURCE
              WHERE TYPE = 'TRIGGER'
              AND UPPER(TEXT) LIKE '%NEXTVAL%'
              )
            ON BNAME = TRIGGER_NAME
            LEFT JOIN
              (SELECT NAME WNAME,
                TEXT WTEXT
              FROM USER_SOURCE
              WHERE TYPE = 'TRIGGER'
              AND UPPER(TEXT) LIKE '%IS NULL%'
              )
            ON WNAME             = TRIGGER_NAME
            WHERE TRIGGER_TYPE   = 'BEFORE EACH ROW'
            AND TRIGGERING_EVENT = 'INSERT'
            )
          )
        ) ;
      EXECUTE IMMEDIATE STMT INTO STMT;
      --dbms_output.put_line(stmt);
      EXECUTE IMMEDIATE STMT;
    END RESET_USER_SEQUENCES_TO_DATA;
    

ملحوظات:

  1. يستخرج الإجراء الأسماء من كود التشغيل ولا يعتمد على اصطلاحات التسمية
  2. للتحقق من التعليمات البرمجية التي تم إنشاؤها قبل التنفيذ، قم بتبديل التعليقات على السطرين الأخيرين

أقوم بعمل بديل بحيث لا يحتاج المستخدم إلى معرفة القيم، حيث يحصل النظام على المتغيرات ويستخدمها للتحديث.

--Atualizando sequence da tabela SIGA_TRANSACAO, pois está desatualizada
DECLARE
 actual_sequence_number INTEGER;
 max_number_from_table INTEGER;
 difference INTEGER;
BEGIN
 SELECT [nome_da_sequence].nextval INTO actual_sequence_number FROM DUAL;
 SELECT MAX([nome_da_coluna]) INTO max_number_from_table FROM [nome_da_tabela];
 SELECT (max_number_from_table-actual_sequence_number) INTO difference FROM DUAL;
IF difference > 0 then
 EXECUTE IMMEDIATE CONCAT('alter sequence [nome_da_sequence] increment by ', difference);
 --aqui ele puxa o próximo valor usando o incremento necessário
 SELECT [nome_da_sequence].nextval INTO actual_sequence_number from dual;
--aqui volta o incremento para 1, para que futuras inserções funcionem normalmente
 EXECUTE IMMEDIATE 'ALTER SEQUENCE [nome_da_sequence] INCREMENT by 1';
 DBMS_OUTPUT.put_line ('A sequence [nome_da_sequence] foi atualizada.');
ELSE
 DBMS_OUTPUT.put_line ('A sequence [nome_da_sequence] NÃO foi atualizada, já estava OK!');
END IF;
END;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top