2012-12-07 36 views
0

我有這個工作代碼。每次運行INSERT INTO "HR"."CITY" (CITY_ID) VALUES (0);時,CITY_ID中的數據將會增加一個像這樣的CT0001, CT0002 ... CT0015用組合字符創建觸發器

CREATE TABLE "HR"."CITY" 
    ( 
    "CITY_ID" VARCHAR2(40 BYTE) 
    ) ; 


    CREATE OR REPLACE TRIGGER "HR"."PK_MAX_TRIGGER_CITY" 
BEFORE INSERT ON CITY 
FOR EACH ROW 
DECLARE 
    CNT NUMBER; 
    PKV CITY.CITY_ID%TYPE; 
    NO NUMBER; 
BEGIN 
    SELECT COUNT(*)INTO CNT FROM CITY; 

    IF CNT=0 THEN 
     PKV:='CT0001'; 
    ELSE 
     SELECT 'CT'||LPAD(MAX(TO_NUMBER(SUBSTR(CITY_ID,3,LENGTH(CITY_ID)))+1),4,'0') INTO PKV 
     FROM CITY; 
    END IF; 
    :NEW.CITY_ID:=PKV; 
END; 
/
ALTER TRIGGER "HR"."PK_MAX_TRIGGER_CITY" ENABLE; 

我想要做的是這個E1, E2 ... E15

我的代碼更改爲:

IF CNT=0 THEN 
     PKV:='E1'; 
    ELSE 
     SELECT 'E'||LPAD(MAX(TO_NUMBER(SUBSTR(CITY_ID,3,LENGTH(CITY_ID)))+1),4,'0') INTO PKV 

它工作在第一添加E1到數據庫,但沒有第二次。括號內的內容只是讓我難以消化。我希望這裏的任何人都能向我解釋在托架中究竟發生了什麼,並幫助我解決這個問題。

在此先感謝。

回答

1

您需要做的是修改您的Else零件查詢。

SELECT 'E'||(MAX(TO_NUMBER(SUBSTR(CITY_ID,2))+1)) INTO PKV 
    FROM CITY; 

只要你想找到什麼是括號發生 開始與內支架。

See the result of this query: SELECT SUBSTR(CITY_ID,2) FROM CITY; 

在這裏,你會E,其中E永遠存在在第一的位置,所以我們會發現從2nd position後的字符串中提取的字符串。 然後

SELECT TO_NUMBER(SUBSTR(CITY_ID,2)) FROM CITY ; 

- 這是字符串轉換成number.Then它會找到從表CITY最大數量,之後

SELECT MAX(TO_NUMBER(SUBSTR(CITY_ID,2)))+1 FROM CITY ; 

加1最後追加的不變E與結果 。

SELECT 'E'||(MAX(TO_NUMBER(SUBSTR(CITY_ID,2))+1)) INTO PKV 
    FROM CITY; 

但拿我的建議,創建一個序列city_id_seq,這會比你現在正在做什麼更好的解決辦法。

CREATE SEQUENCE city_id_seq 
MINVALUE 1 
MAXVALUE 99999999999 
START WITH 1 
INCREMENT BY 1 
CACHE 20; 


CREATE OR REPLACE TRIGGER "HR"."PK_MAX_TRIGGER_CITY" 
BEFORE INSERT ON CITY 
FOR EACH ROW 
DECLARE 
v_city_id PLS_INTEGER; 
BEGIN 
    SELECT city_id_seq.nextval INTO v_city_id FROM DUAL; 

:NEW.CITY_ID :='E'||v_city_id ; 

/* if you are using oracle 11g 
:NEW.CITY_ID:='E'||city_id_seq.nextval; 
*/ 

END; 
/
+0

嗨,我真的很感謝你的解釋。如果我正確理解這個'SELECT MAX(TO_NUMBER(SUBSTR(CITY_ID,2)))+ 1 FROM CITY;'選擇最大數字,然後遞增1?並且比'E'||'是否意味着'E或',因爲符號'||'? – sg552

+0

我的建議代碼出現錯誤。 'TRIGGER HR.PK_MAX_TRIGGER_CITY錯誤:'錯誤是'PL/SQL:語句被忽略'和'PLS-00357:表,視圖或序列參考'CITY_ID_SEQ.NEXTVAL'在此上下文中不允許。任何想法? – sg552

+0

@ sg552:你使用的是哪個版本的oracle,這種語法在Oracle 11g中有效,否則在觸發器中使用select語句來獲取序列 –

0

方括號內的代碼::

select LPAD(MAX(TO_NUMBER(SUBSTR('CT0015',3,LENGTH('CT0015')))+1),4,'0') from dual; 

實際切割city_id的值從3位置到字符串的末尾,然後將其轉換爲數字數據類型加1個,然後填零到左側

所以在這種情況下o/p 0016