3.14.2 数据库更新特定字段SQL/语句块
1.更新单表中某一字段
1.1适用于单条或者因为in条件1-1000条数据
下面是更改CMS_CONTRACT_INFO 表中合同编号为CMCC987最后更新时间为当前时间,或者注释里特定时间。
1 UPDATE CMS_CONTRACT_INFO CCI 2 SET CCI.LAST_UPDATE_DATE = SYSDATE 3 /* to_date('20190516 10:12:50','yyyyMmdd HH24:mi:ss')*/ 4 WHERE CCI.CONTRACT_NO IN ('CMCC987')
1.2 使用where表条件可更改大批量数据,但改之前一定注意备份。
1.3 有时候需要根据条件往后推时间。我使用语句块来完成。
以下语句块是,完成根据条件( 你要更改的数据条件)完成每10分钟往后更新30条数据,数据的开始时间都由你设定。
1 --存储过程或语句块声明时使用 2 DECLARE 3 --定义更改时间变量 4 V_COMMIT_TIME DATE; 5 --定义你要打散数量 6 V_COUNT INT; 7 --你参数的类型和数据库一致 8 V_CONTRACT_NO CMS.CMS_CONTRACT_INFO.CONTRACT_NO%TYPE; 9 BEGIN 10 --初始化参数 11 V_COUNT := 1; 12 V_COMMIT_TIME := sysdate; 13 /* V_COMMIT_TIME := to_date('2018-12-10 00:00:01', 'yyyy-mm-dd hh24:mi:ss');*/ 14 --把需要改的数据条件标识数据循环到CONTRACT_CURSOR中 15 for CONTRACT_CURSOR in(SELECT CI.CONTRACT_NO FROM CMS_CONTRACT_INFO CI 16 WHERE CI.CONTRACT_NO in()group by CI.CONTRACT_NO) 17 18 LOOP 19 --根据循环的条件更新数据 20 UPDATE CMS.CMS_CONTRACT_INFO CI 21 SET LAST_UPDATE_DATE = V_COMMIT_TIME 22 WHERE CI.CONTRACT_NO = CONTRACT_CURSOR.CONTRACT_NO; 23 --超过30条更新下一次 24 IF V_COUNT = 30 THEN 25 --打印修改数目 26 DBMS_OUTPUT.PUT_LINE('更新:'||TO_CHAR(V_COUNT)); 27 V_COUNT := 0; 28 --当前时间加10分钟一批 29 V_COMMIT_TIME := (V_COMMIT_TIME+10/1440); 30 COMMIT; 31 END IF; 32 --下一次更新 33 V_COUNT := V_COUNT + 1; 34 END LOOP; 35 DBMS_OUTPUT.PUT_LINE('更新:'||TO_CHAR(V_COUNT)); 36 END;
努力不一定成功,但不努力一定会失败~