sqloracle-databaseora-01722

Altering Oracle Sequence with result of two subqueries


I am trying to alter a sequence with the result of two subqueries. I am new with Oracle and stuck with a syntax. If you can, please help me with this :

alter sequence COM_UPDN_BASE_FRMT_DTL_SEQ increment by ( (select max(id) from COM_UPDN_BASE_FRMT_DTL) - (select last_number from all_sequences where sequence_name = 'COM_UPDN_BASE_FRMT_DTL_SEQ') ) ;

Upon Executing this, I am getting an "invalid number" error. What am I missing here?


Solution

  • You'll definitely want PL/SQL and dynamic SQL, but don't use LAST_NUMBER.

    Try something like this instead:

    DECLARE
        l_max NUMBER;
        l_curr_seq_val NUMBER;
        l_new_seq_val NUMBER;
        l_curr_inc_bv number;
    BEGIN
        --Get max value from table
        SELECT max(id) INTO l_max FROM COM_UPDN_BASE_FRMT_DTL;
        --get current value from seq and current increment_by from dba_sequences
        SELECT com_updn_base_frmt_dtl_seq.nextval,increment_by INTO l_curr_seq_val,l_curr_inc_bv FROM dba_sequences WHERE sequence_name = 'COM_UPDN_BASE_FRMT_DTL_SEQ' and sequence_owner=USER;
        --If there is a difference, do the fix
        if (l_curr_inc_bv != l_max-l_curr_seq_val) then
            EXECUTE IMMEDIATE
            'ALTER SEQUENCE com_updn_base_frmt_dtl_seq INCREMENT BY ' || (l_max - l_curr_seq_val);
            SELECT com_updn_base_frmt_dtl_seq.nextval INTO l_new_seq_val from dual;
            EXECUTE IMMEDIATE
            'ALTER SEQUENCE com_updn_base_frmt_dtl_seq INCREMENT BY ' || (l_curr_inc_bv);
        end if;
    END;
    /