Исправление несинхронной c последовательности с PL / SQL - PullRequest
0 голосов
/ 28 января 2020

Кто-то вставил данные здесь и там без использования последовательности, поэтому теперь некоторые таблицы не синхронизированы c, я создал этот скрипт для их восстановления.

declare
    l_val number;
    maxvalueid number;
begin
    execute immediate 'select s_ref_declinaison_geo.nextval from dual' INTO l_val;
    execute immediate 'select max(id_technique) from t_ref_declinaison_geo' INTO maxvalueid;
    execute immediate 'alter sequence s_ref_declinaison_geo increment by +' || maxvalueid-l_val;
end;
/

однако я получаю

PLS-00382: expression du mauvais type (bad type expresion)
ORA-06550: Ligne 7, colonne 5 :
PL/SQL: Statement ignored
Location   : sql/V12.x/xxxxx.sql (C:\checkouts\web\xxxxx-data\flyway\sql\V12.x\XXXXXXXXXXXXXXXX)
Line       : 4
Statement  : declare
    l_val number;
    maxvalueid number;
begin
    execute immediate 'select s_ref_declinaison_geo.nextval from dual' INTO l_val;
    execute immediate 'select max(id_technique) from t_ref_declinaison_geo' INTO maxvalueid;
    execute immediate 'alter sequence s_ref_declinaison_geo increment by +' || maxvalueid-l_val;
end;


Une erreur est survenue lors de l'exécution de flyway.

поэтому я предполагаю, что это не нравится: maxvalueid-l_val

Но почему?

Спасибо.

РЕДАКТИРОВАТЬ:

здесь финальный сценарий

DECLARE
    l_val number;
    maxvalueid number;
    offset number;
BEGIN
    execute immediate 'select s_ref_declinaison_geo.nextval from dual' INTO l_val;
    execute immediate 'select max(id_technique) from t_ref_declinaison_geo' INTO maxvalueid;
    offset := maxvalueid-l_val;
    IF offset > 0
        execute immediate 'alter sequence s_ref_declinaison_geo increment by +' || offset;
        execute immediate 'select s_ref_declinaison_geo.nextval from dual' INTO l_val;
        execute immediate 'alter sequence s_ref_declinaison_geo increment by +1';
    END IF
END;
/

Ответы [ 2 ]

1 голос
/ 28 января 2020

Из комментариев я делаю предположение:

Я думаю, что вы хотите сбросить последовательность, чтобы начать с нового номера. В соответствии с ALTER SEQUENCE из библиотеки Oracle Online Database Documentation Library, 12 c Release 1 (12.1.0.2) :

Для перезапуска Последовательность под другим номером, вы должны удалить и заново создать его.

Использование START WITH даст ему новую отправную точку. Обратите внимание, что это создает последовательность по умолчанию. Вы должны проверить все настройки вашей текущей последовательности перед выполнением этого:

declare
    maxvalueid number;
begin
    select max(id_technique) INTO maxvalueid from t_ref_declinaison_geo;
    execute immediate 'drop sequence s_ref_declinaison_geo';
    execute immediate 'create sequence s_ref_declinaison_geo start with ' || (maxvalueid + 1);
end;

Это должно заставить вашу процедуру работать (она не понимает вычисления, поэтому () необходимы). Вашему SELECT не нужно никаких execute immediate:

declare
    l_val number;
    maxvalueid number;
begin
    select s_ref_declinaison_geo.nextval INTO l_val from dual;
    select max(id_technique) INTO maxvalueid from t_ref_declinaison_geo;
    execute immediate 'alter sequence s_ref_declinaison_geo increment by +' || (maxvalueid-l_val);
end;
1 голос
/ 28 января 2020

Попробуйте с временной переменной:

 declare
     l_val number;
     maxvalueid number;
   t number ;
   v varchar2(100);
 begin
     execute immediate 'select s_ref_declinaison_geo.nextval from dual' INTO l_val;
     execute immediate 'select max(id_technique) from t_ref_declinaison_geo' INTO maxvalueid;
   t := maxvalueid-l_val ;
   v := 'alter sequence s_ref_declinaison_geo increment by +' || t ;
     execute immediate v ;
 end;
 /
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...