最近在做一个T1的.NET项目,数据库oracle的时候,遇到一个问题。.NET里面的某个数据库表类的某个字段是guid类型。但是用oracle生成的guid。跟.NET的guid
无法识别。导致报错。数据显示不了。经过查资料,网上好像很少是专门去说明这个问题的博客,后来经过多次查看资料。故总结如下经验。
在Oracle SQL 提供了一个生成guid的函数sys_guid:
SQL> select sys_guid() from dual ;
SYS_GUID()
--------------------------------
A8F662B86E7413FEE040970A437C6BD7
但是oracle生成的guid跟.NET的guid看起来不一样。.net的guid是36字符,oracle的只有32个数字。再将oracle的guid制造成跟.net的一样。
CREATE OR REPLACE FUNCTION get_uuid RETURN VARCHAR IS guid VARCHAR (50); BEGIN guid :=sys_guid(); RETURN substr(guid,1,8)||'-'||substr(guid,9,4)||'-'||substr(guid,13,4)||'-'||substr(guid,17,4)||'-'||substr(guid,21,12); END get_uuid;
但是通过.NET程序判断,结果还是不一样,这个时候,通过肉眼是看不到区别(因为我看了1个多小时都没看出端倪。哈哈)。后来去查看资料,就明白了原来是oracle生成的那个guid
存储方式跟.NET的存储方式不一样。分别是hextoraw与rawtohex(想知道清楚一点,可以查看我的其中一篇博客"Oracle hextoraw和rawtohex").
后来修改成相同的存储方式,就ok
CREATE OR REPLACE FUNCTION get_uuid RETURN VARCHAR IS guid VARCHAR (50); BEGIN guid := lower(RAWTOHEX(sys_guid())); RETURN substr(guid,1,8)||'-'||substr(guid,9,4)||'-'||substr(guid,13,4)||'-'||substr(guid,17,4)||'-'||substr(guid,21,12); END get_uuid;