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。