例如表中有个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;

解决方案 »

  1.   

    -- 你这是数值类型的,最大长度是什么意思?
    -- 就是说:包括小数位,求这个数值的总共的位数?-- 两种方法:(1) 转换为字符类型,再用length()函数:length(to_char(money))
    --          (2) 直接用length()函数:               length(money)
      

  2.   

    scale取的是小数部分的位数,就本例而言,你得到的应该是2。
    你要取它的精度,应该取属性:OCI_ATTR_PRECISION
      

  3.   

    哦 谢谢 我看了一下 确实取出小数部分了不过还有问题是 我用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类型的指针吗这样不会出现越界的情况?
      

  4.   

    我在10g里头测试 ,没任何问题:
    已经成功连上数据库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));表已创建。
      

  5.   

    我比较奇怪的是sb2和ub1的长度明显是不同的
    不知道这个函数是如何处理的好像没有哪个参数指明传进去的指针是sb2型的还是ub1型的
    另外,有一点奇怪的是ub1能表示的长度有限 最多2^8=256 也太小了点吧
      

  6.   

    想请教一下 你这里 列长度 列精度 小数位数 分别是用哪个OCI_xxx取出来的列精度是啥意思  跟小数位数有何区别
      

  7.   

    Oracle的数据存放是有计算规则的,干什么不直接查询字典表呢?
    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('字段名')
      

  8.   

    1. ub1描述precision,完全足够,因为precision(精度,即有效数字位数),指的是数值型,而不是字符串。你也没有必要对字符串型字段取precision属性,字符串取size属性即可。
       scale,指的是小数位数。两者不要弄混。
    2. 列精度就是指的有效数字位数,既包括整数部分,也包括小数部分。而小数位数,指的就是SCALE。
      

  9.   

    这种取法限制较大,需要知道字段名和表名我现在的情况是,只知道sql(sql是用户输入的) 需要获得sql输出列的信息
      

  10.   

    谢谢 我发现原来是我用的工具的bug表里面列的宽度确实是12来的 但是我用的工具显示的是22所以一直有问题-_-!