日期:2014-05-16 浏览次数:20501 次
要求格式为: SL+当前时间+0001 测试表 create table Pdms_polling( p_id INT PRIMARY KEY, p_year date, p_num varchar2(20) ); -- 触发器. CREATE OR REPLACE TRIGGER tr_auto_set_id AFTER INSERT ON Pdms_polling DECLARE v_newID INT; -- 暂存主键 v_newNum varchar(30); -- 新的 流水号 v_oldNum varchar(30); -- 旧的流水号 -- 游标: 用于检索 当前表的所有 流水号字段为空的数据。 -- 将当天的所有数据,按顺序,自动编号排序 -- 该查询结果包含三列,分别为 ID, 现有的流水号, 按照 ROW_NUMBER 排序后的流水号。 CURSOR c_need_auto IS SELECT p_id, p_num, 'SL' || TO_CHAR(p_year, 'YYYYMMDD') || TRIM(TO_CHAR( ROW_NUMBER() OVER(PARTITION BY TO_CHAR(p_year, 'YYYYMMDD') ORDER BY p_id ), '0000')) AS new_num FROM Pdms_polling WHERE EXISTS( SELECT 1 FROM Pdms_polling p2 WHERE TRUNC(p2.p_year) = TRUNC(Pdms_polling.p_year) AND p_num IS NULL ); BEGIN -- 打开游标. OPEN c_need_auto; LOOP -- 填充数据(主表). FETCH c_need_auto INTO v_newID, v_oldNum, v_newNum; -- 假如没有检索到(主表)数据,结束循环处理 Exit when c_need_auto%NOTFOUND; -- 这里判断 旧流水号是否为 NULL, 假如为空的话,那么将其更新为 ROW_NUMBER 排序后的流水号。 -- 需要注意的是,假如你系统,不会去删除数据的话,那么没有问题。 -- 假如你的系统,会删除中间的数据的话,那么,会导致这里的流水号计算错误。 -- 那么可能就要把下面的 v_oldNum IS NULL 修改为 v_oldNum IS NULL OR v_oldNum != v_newNum -- 结果也很明显,中间删除掉的流水号,会在某一次追加以后,被下一条依次填充上来。最后可能造成关联表的数据不匹配。 IF v_oldNum IS NULL THEN UPDATE Pdms_polling SET p_num = v_newNum WHERE p_id = v_newID; END IF; END LOOP; -- 关闭游标 CLOSE c_need_auto; END; -- 测试: SQL> INSERT INTO Pdms_polling VALUES(1, SYSDATE, NULL); 已创建 1 行。 SQL> INSERT INTO Pdms_polling VALUES(2, SYSDATE, NULL); 已创建 1 行。 SQL> INSERT INTO Pdms_polling VALUES(3, SYSDATE, NULL); 已创建 1 行。 SQL> INSERT INTO Pdms_polling 2 SELECT 4, SYSDATE, NULL FROM dual UNION ALL 3 SELECT 5, SYSDATE-1, NULL FROM dual UNION ALL 4 SELECT 6, SYSDATE+1, NULL FROM dual UNION ALL 5 SELECT 7, SYSDATE-1, NULL FROM dual UNION ALL 6 SELECT 8, SYSDATE+1, NULL FROM dual UNION ALL 7 SELECT 9, SYSDATE, NULL FROM dual ; 已创建6行。 SQL> ALTER session 2 SET nls_date_format='yyyy-mm-dd hh24:mi:ss'; 会话已更改。 SQL> SELECT * FROM Pdms_polling; P_ID P_YEAR P_NUM ---------- ------------------- -------------------- 1 2011-06-09 20:51:55 SL201106090001 2 2011-06-09 20:51:55 SL201106090002 3 2011-06-09 20:51:55 SL201106090003 4 2011-06-09 20:51:55 SL201106090004 5 2011-06-08 20:51:55 SL201106080001 6 2011-06-10 20:51:55 SL201106100001 7 2011-06-08 20:51:55 SL201106080002 8 2011-06-10 20:51:55 SL201106100002 9 2011-06-09 20:51:55 SL201106090005 已选择9行。?