日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Oracle10G序列名因標識符長度太大導致無法創建

作者:夢凝哲雪 更新時間: 2022-02-22 編程語言

Oracle編碼集

AMERICAN_AMERICA.ZHS16GBK

SIMPLIFIED CHINESE_CHINA.ZHS16GBK

場景

需要創建一個序列 但此時名稱長度定義的比平時長 導致無法創建

create sequence seq_s_OrderDetails_odid start with 10001 increment by 1;

在這里插入圖片描述

根據報錯信息 可以查提示

ORA-12899:列"SCOTT"."OP_INFO"."ONAME”的值太大(實際值:23,最大值: 20)
select oname, length(oname) num from op_info order by num desc;

檢查發現序列名seq_s_OrderDetails_odid 的長度 23

select length('seq_s_OrderDetails_odid') from dual;

在這里插入圖片描述

檢查客戶端編碼集為 SIMPLIFIED CHINESE_CHINA.ZHS16GBK

select userenv('language') from dual ;

同樣序列創建的代碼在其他環境下 可以創建成功

檢查客戶端編碼集為 AMERICAN_AMERICA.ZHS16GBK


而已知在Oracle中標識符最大長度是30個字符

PS:
標識符,即用戶自定義的關鍵詞,比較表名、字段名、視圖名、序列名、主鍵等,表名也屬于標識符,

原因:
Oracle里凡是需要命名的對象其標識符均不能超過30個字符,這是因為數據字典表的與記錄這些數據庫對象相關信息的系統表相關的字段的數據類型已經定義好了這樣的大小。
你可以查數據字典,里面有定義,依次為

USER_TABLES
USER_TAB_COLUMNS
USER_CONSTRAINTS

例如,USER_TABLES這個系統表視圖里對表名這個字段定義的數據類型就是varchar2(30),即這個字段最大只能為30個字節。

--1、查看表名長度的限制

select * from all_TAB_COLUMNS where table_name = 'USER_TABLES' and column_name ='TABLE_NAME';

--2、查看列名長度的限制

select * from all_TAB_COLUMNS where table_name = 'USER_TAB_COLUMNS' and column_name ='COLUMN_NAME';

--3、先看約束名稱的長度限制

select * from all_TAB_COLUMNS where table_name = 'USER_CONSTRAINTS' and column_name ='CONSTRAINT_NAME';

1、查看表名長度的限制
在這里插入圖片描述
2、查看列名長度的限制
在這里插入圖片描述
3、先看約束名稱的長度限制
在這里插入圖片描述


臨時解決方案:

定義的序列名長度小于20 就可以成功!!!

-- 創建序列  seq_s_purdetail_pdid 剛好20
create sequence seq_s_purdetail_pdid start with 10001 increment by 1;

-- 查詢序列  注意用 system 用戶查詢
select * from dba_sequences  where SEQUENCE_NAME = upper('seq_s_purdetail_pdid');

-- 刪除序列
drop sequence SEQ_S_PURDETAIL_PDID;

在這里插入圖片描述

但終歸沒找到詳細原因 留下疑云重重。。。


待探究是否因兩種編碼集的區別導致 ???

PS

自Oracle 12.2 開始,標識符長度上限變為128字節

原文鏈接:https://blog.csdn.net/Klhz555/article/details/122883835

欄目分類
最近更新