2012-12-07 35 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