Posted by: piman007 | 13-06-2007

Oracle TRIGGER gen id แบบ reset เมื่อขึ้นวันใหม่

โจทย์มีอยู่ว่าใช้ Trigger gen id ใหม่ ขึ้นมา แต่ดันต้องไปดูว่าวันที่เปลี่ยนหรือไม่ ถ้าหากวันที่เปลี่ยน seq. มันก็ต้อง reset เป็น 0
ต้อง drop seq. แล้ว create seq. ใหม่ ให้ start ค่าที่ 0 แต่เผอิญปัญหาอยู่ที่ BEGIN ใน TRIGGER เขียน drop หรือ create ไม่ได้
ทำไงดี ก็ต้องเขียน procedure ขึ้นมาลองรับ OK. มันฟ้องว่า ไม่สามารถ COMMIT ใน TRIGGER ได้อีก เฮ้ออออออ เหนื่อย
ต้องเพิ่มคำสั่ง PRAGMA AUTONOMOUS_TRANSACTION  ไว้ใน declare ถึงจะผ่าน 
 
ตอนนี้เหลือแต่เปรียบเทียบวันที่เท่านั้น
 
เดี๋ยวว่างๆ จะมาเขียนต่อนะครับ
 
CREATE OR REPLACE PROCEDURE do_sql(p_sql VARCHAR2) AS
BEGIN
  EXECUTE IMMEDIATE p_sql;
END;
 
CREATE OR REPLACE TRIGGER DF101_INS_TRIG
BEFORE INSERT ON DF101
FOR EACH ROW
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
 strID varchar2(9);
    strBankCode varchar(3);
 strYear varchar(2);
 strBranchCode varchar(5); 
BEGIN
 SELECT TO_CHAR(DF101_SEQ.NEXTVAL,’00000000′) INTO strID FROM DUAL;
 SELECT ‘006’ INTO strBankCode FROM DUAL;
 SELECT SUBSTR(TO_CHAR(TO_NUMBER(:NEW.BRANCH_OWNER),’000000′),3) INTO strBranchCode FROM DUAL;
 SELECT SUBSTR(TO_CHAR(TO_NUMBER(TO_CHAR(SYSDATE,’YYYY’))+543),3) INTO strYear FROM DUAL;
 SELECT CONCAT(‘1’,substr(strID,3)) INTO strID FROM DUAL;
    :NEW.ID:= strID;
 :NEW.DF101_REPORT_ID:=CONCAT(strBankCode,CONCAT(strBranchCode,CONCAT(strYear,strID)));
 DO_SQL(‘DROP SEQUENCE DF101_SEQ’);
 DO_SQL(‘CREATE SEQUENCE DF101_SEQ START WITH 50 INCREMENT BY 1 MINVALUE 0 MAXVALUE 500 CYCLE CACHE 5’);
END;

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

หมวดหมู่

%d bloggers like this: