怎樣突破錶名30個字元的限制(r2筆記51天)
阿新 • • 發佈:2022-05-04
根據oracle的規範,物件的長度最大為30位,也就是說,在平時的使用中如果碰到表名長度大於30位,首先oracle是不答應的,它會提示idnetifier too long的錯誤。而30位的長度總是感覺受到限制,現在在做資料遷移的時候就碰到的類似的問題。
當然了,我不是想強行建立一個大於30位的表名,本來可讀性就差些,辦法總比困難多。想想別的招。
舉個例子。
有一個表customer_details,表名長度是16位。
SQL> SELECT LENGTH('CUSTOMER_DETAILS') FROM DUAL;
LENGTH('CUSTOMER_DETAILS')
--------------------------
16
CUSTOMER_DETAILS_EXT_1
..
CUSTOMER_DETAILS_EXT_1000
那樣的話,子表的表名最大長度就是25位。
SQL> SELECT LENGTH('CUSTOMER_DETAILS_EXT_1000') FROM DUAL;
LENGTH('CUSTOMER_DETAILS_EXT_1000')
-----------------------------------
25
在很多情況下,表名長度可能就達到了25位甚至更多,接近30位,那樣的話再加字尾EXT_XXX表名就肯定不夠了。
現在想能不能給表名做一個很好的對映,能夠根據這個別名和真正的表明得到 重新命名後的表名。
換句話就是假設起的表的別名為TEST,能夠根據TEST 和表名 CUSTOMER_DETAILS 得到子表名CUSTOMER_DETAILS_EXT_1000
CREATE TABLE 12389_EXT_1000 AS SELECT *from cat where rownum<2
*
ERROR at line 1:
ORA-00903: invalid table name
SQL> create table t_12389_ext_1000 as select*from cat where rownum<2;
Table created.
還有有的朋友可能會說,為什麼不用data_object_id,那個代表最新的object_id。因為我們需要不變的id。
比如下面的場景中,data_object_id就可能和Object_Id不一致。
SQL> select object_id,data_object_id,object_name from dba_objects where owner='SYS' and object_name='T';
OBJECT_ID DATA_OBJECT_ID OBJECT_NAME
---------- -------------- ------------------------------
18040 18040 T
SQL> TRUNCATE TABLE T;
Table truncated.
SQL> select object_id,data_object_id,object_name from dba_objects where owner='SYS' and object_name='T';
OBJECT_ID DATA_OBJECT_ID OBJECT_NAME
---------- -------------- ------------------------------
18040 18041 T