Plsql 用PL/SQL修复不同步序列

Plsql 用PL/SQL修复不同步序列,plsql,flyway,Plsql,Flyway,有人在不使用序列的情况下到处插入数据,所以现在有些表不同步, 我制作这个脚本是为了修复它们 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_declina

有人在不使用序列的情况下到处插入数据,所以现在有些表不同步, 我制作这个脚本是为了修复它们

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;
/

使用临时变量进行尝试:

 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;
 /

使用临时变量进行尝试:

 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;
 /

根据我的评论,我做了一个假设:

我想你应该重新设置序列,从一个新的数字开始。根据来自以下方面的信息:

要以不同的编号重新启动序列,必须删除并重新创建它

使用
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;

这将使您的过程正常工作(它不理解计算,因此需要
()
)。您的
选择
不需要任何
立即执行

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;

根据我的评论,我做了一个假设:

我想你应该重新设置序列,从一个新的数字开始。根据来自以下方面的信息:

要以不同的编号重新启动序列,必须删除并重新创建它

使用
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;

这将使您的过程正常工作(它不理解计算,因此需要
()
)。您的
选择
不需要任何
立即执行

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;

以前的“增量”是什么?没有以前的增量,有人插入了硬编码ID。序列中的curval为6,最大id为87564。我需要将曲线设置为87564。我不会手动执行此操作,因为我将使此脚本在多个表上运行—在序列上始终有一个增量by。默认值为1。以前的“增量依据”是什么?没有以前的增量依据,使用硬编码ID插入的人。序列中的curval为6,最大id为87564。我需要将曲线设置为87564。我不会手动执行此操作,因为我将使此脚本在多个表上运行—在序列上始终有一个增量by。默认值为1。