最近我写了一个Oracle存储过程如下:
create table testt(param varcahr(50), len number, ts date);
create or replace procedure testp(p_a varchar)
IS
BEGIN
insert into testt(param,len,ts) values(p_a,length(p_a),sysdate);
commit;
End;
我在SQL Developer中直接执行这个存储过程 testp('12345') 系统显示长度是5,而 我使用OLEDB.Oracle驱动,使用C#程序执行这个存储过程时,发现同样的调用记录却显示长度为6.
我的系统是Windows 2008, 数据库是 Oracle 11G 11.2.0.1
我运行程序的电脑是Win 7,.Net Framwork4.5
望高手指导一下!
谢谢!
把p_a插入到数据库中,看生成的串是不是有区别就知道了。
字符串最后还有一个终结符,也占了一个存储单位。
插入了,表面上看是一样的,但是用length函数取的时候长度就是多了一位。如果我直接执行存储过程,那么长度就正确了。只是在我调用OLEDB.Oracle执行时长度就不对了。
所以我认为是OLEDB.Oracle在做string to varchar2转换时是不是加了一位null.
没有人知道原因吗?这个问题是不是算Bug
可以看看插入时字符的具体内容,看上去是c#对字符串加了一个结束符
用oracle算长度的函数算一下c#插入的字符串