我使用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;
/
難道你不能簡單地使用一個SUBSTR來修改表名稱,比如25個字符,然後concat'_SEQ'或'_TRIG'? – Aleksej