暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 双变量的Pro * C - DML

askTom 2017-04-03
287

问题描述

嗨,汤姆,
在将double变量插入数据库列时,它会四舍五入。数据库列是number(12,2)。
当我尝试插入2146327346.47时,它被插入为2146327346.47。类似的2152186221.53
作为2152186222.00插入,2248083191.91作为2248083192.00。你能告诉我同样的原因和解决方法吗?虽然这并不总是发生,即一些值以精确的精度和规模插入,一些得到舍入。我有一个Pro * C application.Code如下

#include
#include
#include
#include

EXEC SQL BEGIN DECLARE SECTION;
char *cnstr = "scott/tiger";
EXEC SQL END DECLARE SECTION;

void fn_sqlerrmsg(void);

void fn_sqlerrmsg()
{
printf("Error:%ld:%s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
}

int main()
{

  EXEC SQL WHENEVER sqlwarning CONTINUE;
  EXEC SQL WHENEVER SQLERROR do fn_sqlerrmsg;

  double d_readdata;
  char ch,file_name[25];
  FILE *fp;
  char *line =NULL;
  size_t len = 0;
  ssize_t read;
  
  EXEC SQL CONNECT :cnstr;
  EXEC SQL WHENEVER NOTFOUND got to not_found;
  
  strcpy(file_name,"file1");
  
  fp = fopen (file_name,"r")
  {
     perror("error while opening file");
     exit(EXIT_FAILURE);
  }  

  while((read = getline(&line,&len,fp)!=-1)
  {

    sscanf(line,"%lf",&d_readdata);
    prinft("%lf",d_readdata);
    EXEC SQL 
       INSERT INTO test_insert(testdata) VALUES(:d_readdata);
   }

   fclose(fp);
   EXEC SQL COMMIT;
    
   return 1;

not_found:
printf("Record not found");

}


文件1如下:
2146327346.47
2152186221.53
2248083191.91
377303849.19

专家解答

数字数据类型内部存储为十进制浮点数。但是,您的bind变量是C数据类型 'double',这是一个二进制浮点数。在二进制和十进制浮点数之间转换时,总是期望四舍五入。例如,0.33可以用十进制格式精确表示 (因为它等于3/10 3/100),但不能用二进制格式精确表示,因为它不是二进制分数的总和 (1/2 1/4 1/(2 ^ n)…)

例如,
select to_char(to_binary_double(0.33),'TM') from dual;

给出.33000000000000002

最简单的解决方法是将数字作为字符串传递,并让Oracle使用隐式或显式的TO_NUMBER进行转换。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论