有个表为agreement,现在要求的它的id字段(数值是3223至21947)对应counterpartyid(另外一个表的主键),而counterpartyid有固定的两段:第一段是从2846至3079,第二段是2353至2611,数据库为oracle,怎么写sql让id字段轮番对应两段counterpartyid,因为counterpartyid不够,所以两端对应完了可以重新从第一段开始,然后第二段,直到把agreementid对应完。直接写sql能解决么?
调试欢乐多
DECLARE
L_C INT := 2353;
L_D INT := 2611;
L_A INT := 2846;
L_B INT := 3079;
L_E INT := 0;
CURSOR L_Cur IS
SELECT ID
FROM AGREEMENT
WHERE ID >= 3223
AND ID <= 21947;
BEGIN
L_E := L_C;
FOR I IN L_Cur LOOP
IF L_E BETWEEN L_C AND L_D THEN
UPDATE agreement SET ID=l_e WHERE ID=i.id;
--DBMS_OUTPUT.PUT_LINE(L_E);
L_E := L_E + 1;
ELSIF L_E BETWEEN L_A AND L_B THEN
UPDATE agreement SET ID=l_e WHERE ID=i.id;
--DBMS_OUTPUT.PUT_LINE(L_E);
L_E := L_E + 1;
ELSIF L_E > L_D AND L_E < L_A THEN
L_E := L_A;
ELSIF L_E > 3079 THEN
L_E := L_C;
END IF;
END LOOP;
END;
/
如果counterpartyid是连续的并且和id一起增长,那就好办了,直接update,id和counterpartyid有固定差值。但现在counterpartyid分为两段并且有限。问能否直接用sql在数据库中添加与id对应的counterpartyid数字值(范围只能在两端中)。
DECLARE
L_C INT := 2353;
L_D INT := 2611;
L_A INT := 2846;
L_B INT := 3079;
L_E INT := 0;
CURSOR L_Cur IS
SELECT ID
FROM COLAGREEMENTHEADER
WHERE ID >= 3223
AND ID <= 21947;
BEGIN
L_E := L_C;
FOR I IN L_Cur LOOP
IF L_E BETWEEN L_C AND L_D THEN
UPDATE COLAGREEMENTHEADER SET COUNTERPARTYHQ=l_e WHERE ID=i.id;
--DBMS_OUTPUT.PUT_LINE(L_E);
L_E := L_E + 1;
ELSIF L_E BETWEEN L_A AND L_B THEN
UPDATE COLAGREEMENTHEADER SET COUNTERPARTYHQ=l_e WHERE ID=i.id;
--DBMS_OUTPUT.PUT_LINE(L_E);
L_E := L_E + 1;
ELSIF L_E > L_D AND L_E < L_A THEN
L_E := L_A;
ELSIF L_E > 3079 THEN
L_E := L_C;
END IF;
END LOOP;
END;
查看结果时每到两者交换的地方,插入的不是两者范围的,如id为3643时对应840,3903时为1045,4318时1238,4398时1008,好像是我原来的值,就是当le不在两段时sql中只写了l_e在两者间转换。而ID是增加过的但counterpartyhq没被修改。l_e转换后直接进了下一个for循环。但是如果我修改下counterpartyhq的值,并且把le++就可以了吧。明天在试了。