oracle 一个字段的长度吗,【转】Oracle中如何取一个字段的定义长度

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

项目开发中遇到了获取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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值