该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
项目开发中遇到了获取Oracle字段定义的长度问题,现在将此总结一下,希望能给需要此需求的同行们有个帮助。
在Oracle中获取一个字符的长度的方法很简单,就是利用oracle自带的函数(length()或者lengthb()):
如:
sql> select length('silver bullet') from dual;
结果:13
但有时候,我们需要知道某个表中的某个字段的长度比如
create table CMS_COSTSYS_VOLUMEDETAIL
(
CALCULATION_DETAIL_ID NUMBER(10) not null,
CALCULATION_LINE_ID NUMBER(10) not null,
CALCULATION_HEADER_ID NUMBER(10) not null,
CURRENCY_CODE VARCHAR2(3) not null,
RELATION_CHN VARCHAR2(600),
RELATION_ENG VARCHAR2(600),
CALCULATION_ENG VARCHAR2(600),
CALCULATION_CHN VARCHAR2(600),
CALCULATION_VALUE NUMBER(9,5),
LAST_UPDATED_BY VARCHAR2(20) not null,
CREATED_BY VARCHAR2(20) not null,
CREATED_TIME NUMBER(14) not null,
LAST_UPDATED_TIME NUMBER(14) not null,
CALCULATION_FLAG VARCHAR2(1) default 'N' not null
)
我们在代码中想知道 RELATION_ENG 的长度当数据结构(RELATION_ENG 的长度由VARCHAR2(600)变为VARCHAR2(900),)发生变化时,我们希望在代码中也能随着变化而不需将600改为900。
select t.DATA_LENGTH
from USER_TAB_COLUMNS t
where t.TABLE_NAME = 'CMS_COSTSYS_VOLUMEDETAIL'
and t.COLUMN_NAME = 'RELATION_ENG'
其中:
1.【USER_TAB_COLUMNS 】是Oracle系统视图,定义如下:
create or replace view sys.user_tab_columns as
select TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_TYPE_MOD, DATA_TYPE_OWNER,
DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, COLUMN_ID,
DEFAULT_LENGTH, DATA_DEFAULT, NUM_DISTINCT, LOW_VALUE, HIGH_VALUE,
DENSITY, NUM_NULLS, NUM_BUCKETS, LAST_ANALYZED, SAMPLE_SIZE,
CHARACTER_SET_NAME, CHAR_COL_DECL_LENGTH,
GLOBAL_STATS, USER_STATS, AVG_COL_LEN, CHAR_LENGTH, CHAR_USED,
V80_FMT_IMAGE, DATA_UPGRADED, HISTOGRAM
from USER_TAB_COLS
where HIDDEN_COLUMN = 'NO'
2.【DATA_LENGTH】 是字段定义的长度。
3.【TABLE_NAME 】是要查询字段所属的表名
4.【COLUMN_NAME 】是要查询字段名
自己写了一个方法:
#region 获取指定表的指定字段的长度GetColumnLength
///
/// 获取指定表的指定字段的长度
///
/// 字段所属表的表名
/// 字段名
/// 非负:字段的实际定义的长度,负数:-1 -- 表名或字段名有空值;-2 -- 查询数据库异常;-3 -- 其他异常
protected int GetColumnLength(string table_name, string column_name)
{
int iColumeLength = 0;
if (table_name == "" || table_name == null || column_name == "" || column_name == null)
{
return -1;
}
StringBuilder sb = new StringBuilder();
sb.Append(@"select t.DATA_LENGTH ");
sb.Append(@" from USER_TAB_COLUMNS t ");
sb.Append(@" where t.TABLE_NAME = '");
sb.Append(table_name);
sb.Append(@"' ");
sb.Append(@"and t.COLUMN_NAME = '");
sb.Append(column_name);
sb.Append(@"'");
string strSQL = sb.ToString();
DataTable dtblColumeLength = new DataTable();
//执行sql将查询出来的值放到dtblColumeLength 中
//橘黄色部分自己根据实际的情况,主要功能是执行sql语句,将查询出来的结果放到dtblColumeLength
messageEntity = cms_costsys_volumedetailUip.GetDataTableBySql(strSQL);
if (messageEntity.MsgFlag)
{
dtblColumeLength = (DataTable)messageEntity.MsgValue;
}
else
{
MessageBox.Show("数据检索失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return -2;
}
if (dtblColumeLength == null || dtblColumeLength.Rows.Count <= 0)
{
return -3;
}
iColumeLength = Int32.Parse(dtblColumeLength.Rows[0]["DATA_LENGTH"].ToString());
return iColumeLength;
}
#endregion