2017-03-06 52 views
-1

我使用different question thread中給出的答案中的代碼,該代碼根據表名創建序列和觸發器。基於表名的Concatinate SEQUENCE/TRIGGER名稱

不過,我有一個非常接近exceededing(或已經到達),30個字符的限制表中,所以我得到這個錯誤:

Error report: 
ORA-00972: identifier is too long 
ORA-06512: at line 15 
00972. 00000 - "identifier is too long" 
*Cause: An identifier with more than 30 characters was specified. 
*Action: Specify at most 30 characters. 

我的問題是,我該如何Concat的表名這樣他們不會拋出這個錯誤,仍然保留標題中的一些表名稱?也許concat到20個字符和最後的「_SEQ」或「_TRIG」?

這裏是我的代碼:

DECLARE 
    CURSOR TABLES 
    IS 
    SELECT * 
    FROM USER_TABLES 
    WHERE 0 = 
     (SELECT COUNT(*) 
     FROM USER_CONSTRAINTS 
     WHERE USER_CONSTRAINTS.TABLE_NAME = USER_TABLES.TABLE_NAME 
     AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P' 
    ); 
BEGIN 
    FOR T IN TABLES 
    LOOP 
    EXECUTE IMMEDIATE 'CREATE SEQUENCE '||T.TABLE_NAME||'_SEQ START WITH 1'; 
    EXECUTE IMMEDIATE 'UPDATE '||T.TABLE_NAME||' SET ID = '||T.TABLE_NAME||'Seq.NEXTVAL'; 
    EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD PRIMARY KEY (ID)'; 
    EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||T.TABLE_NAME||'_TRIG '||CHR(10) ||'BEFORE INSERT ON '||T.TABLE_NAME||' '||CHR(10) ||'FOR EACH ROW '||CHR(10) ||'BEGIN '||CHR(10) ||':NEW.ID := '||T.TABLE_NAME||'Seq.NEXTVAL; '||CHR(10) ||'END; '; 
    END LOOP; 
END; 
/
+1

難道你不能簡單地使用一個SUBSTR來修改表名稱,比如25個字符,然後concat'_SEQ'或'_TRIG'? – Aleksej

回答

0

這將使用表名去掉元音(再取名字的前25個字符,如果你碰巧有一個表名是超過25帶有少量元音的字符)。

DECLARE 
    CURSOR TABLES 
    IS 
    SELECT * 
    FROM USER_TABLES 
    WHERE 0 = 
     (SELECT COUNT(*) 
     FROM USER_CONSTRAINTS 
     WHERE USER_CONSTRAINTS.TABLE_NAME = USER_TABLES.TABLE_NAME 
     AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P' 
    ); 
    t_name VARCHAR2(30); 
BEGIN 
    FOR T IN TABLES 
    LOOP 
    t_name := SUBSTR(REGEXP_REPLACE(T.TABLE_NAME, '[aeiou]', NULL, 1, 0, 'i'), 1, 25); 
    EXECUTE IMMEDIATE 'CREATE SEQUENCE '||t_name||'_SEQ START WITH 1'; 
    EXECUTE IMMEDIATE 'UPDATE '||T.TABLE_NAME||' SET ID = '||t_name||'_SEQ.NEXTVAL'; 
    EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD CONSTRAINT '||t_name||'_UNQ PRIMARY KEY (ID)'; 
    EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||t_name||'_TRIG BEFORE INSERT ON '||T.TABLE_NAME||' FOR EACH ROW BEGIN :NEW.ID := '||t_name||'_SEQ.NEXTVAL; END;'; 
    END LOOP; 
END; 
/
+0

感謝!這很好用! – Azarix

+0

在最新版本中,30個字符表的名稱限制已增加到128(字節)。 – BobC

+0

@BobC OP在其帖子中引用30個字符的限制;所以假設他們沒有使用Oracle 12c是合理安全的。 – MT0