例如表中有个money number(10,2)
怎么获得select money from 表名;这个sql返回的列的最大长度10呢我用OCI_ATTR_SCALE取出来数据是错的
sb1 tmpsb1;
swResult = OCIAttrGet((dvoid*) paramhp, (ub4) OCI_DTYPE_PARAM,
(dvoid**) &tmpsb1,(ub4 *) NULL, (ub4) OCI_ATTR_SCALE,
(OCIError *) m_errhp );
if (checkerr(m_errhp, swResult)) { printf("error at %d\n", __LINE__); exit(1); }
cout << tmpsb1;
怎么获得select money from 表名;这个sql返回的列的最大长度10呢我用OCI_ATTR_SCALE取出来数据是错的
sb1 tmpsb1;
swResult = OCIAttrGet((dvoid*) paramhp, (ub4) OCI_DTYPE_PARAM,
(dvoid**) &tmpsb1,(ub4 *) NULL, (ub4) OCI_ATTR_SCALE,
(OCIError *) m_errhp );
if (checkerr(m_errhp, swResult)) { printf("error at %d\n", __LINE__); exit(1); }
cout << tmpsb1;
-- 就是说:包括小数位,求这个数值的总共的位数?-- 两种方法:(1) 转换为字符类型,再用length()函数:length(to_char(money))
-- (2) 直接用length()函数: length(money)
你要取它的精度,应该取属性:OCI_ATTR_PRECISION
//获得列精度
sb1 tmpsb1;
swResult = OCIAttrGet((dvoid*) paramhp, (ub4) OCI_DTYPE_PARAM,
(dvoid**) &tmpsb1,(ub4 *) NULL, (ub4) OCI_ATTR_SCALE,
(OCIError *) m_errhp );
if (checkerr(m_errhp, swResult)) { printf("error at %d\n", __LINE__); exit(1); }
cout << "tmpsb1 = " << (int)tmpsb1 << endl; //获取列宽度
sb2 tmpsb2;
swResult = OCIAttrGet((dvoid*) paramhp, (ub4) OCI_DTYPE_PARAM,
(dvoid**) &tmpsb2,(ub4 *) NULL, (ub4) OCI_ATTR_PRECISION,
(OCIError *) m_errhp );
cout << "tmpsb2 = " << tmpsb2 << endl;
if (checkerr(m_errhp, swResult)) { printf("error at %d\n", __LINE__); exit(1); } ub1 tmpub1;
swResult = OCIAttrGet((dvoid*) paramhp, (ub4) OCI_DTYPE_PARAM,
(dvoid**) &tmpub1,(ub4 *) NULL, (ub4) OCI_ATTR_PRECISION,
(OCIError *) m_errhp );
cout << "tmpub1 = " << (unsigned) tmpub1 << endl;
if (checkerr(m_errhp, swResult)) { printf("error at %d\n", __LINE__); exit(1); }
字段是
NUMBER(22,5)
结果是
tmpsb1 = 5
tmpsb2 = 12
tmpub1 = 12========
ps: 我看oci文档里面写着
ub1 for explicit
describe
sb2 for implicit
describe是啥意思 是指这个函数即能传进ub1类型的指针也能传进sb2类型的指针吗这样不会出现越界的情况?
已经成功连上数据库orcl
成功建立用户会话!
获取关系表ocitest.student的表结构信息
名称 空? 类型 列长度 列精度 小数位数
---------------- -------- ---------------- -------- -------- --------
ID NOT NULL NUMBER 22 22 5
COL2 VARCHAR2 32 0 0
结束会话和数据库连接!
表结构如下:
SQL> create table student(id number(22,5) primary key, col2 varchar(32));表已创建。
不知道这个函数是如何处理的好像没有哪个参数指明传进去的指针是sb2型的还是ub1型的
另外,有一点奇怪的是ub1能表示的长度有限 最多2^8=256 也太小了点吧
select data_precision from user_tab_cols
where table_name = upper('表名')
and column_name = upper('字段名')如果你查询的不是自己的表select data_precision from dba_tab_cols
where owner=upper('表的所有者')
and table_name = upper('表名')
and column_name = upper('字段名')
scale,指的是小数位数。两者不要弄混。
2. 列精度就是指的有效数字位数,既包括整数部分,也包括小数部分。而小数位数,指的就是SCALE。