1.创建存储过程时,有字段为时间类型
create or replace procedure P_AddDefaultService(
websiteId number ,
serviceinfoId number,
startDate timestape,
endDate timestape,
isVail number,
wbs_id out number) is
begin
wbs_id:=seq_websitebookservice.nextval;
insert into websitebookservice
(id,websitebaseinfoid, serviceinfoid, startservicedate,endservicedate, isavail)
values
(wbs_id,websiteId, serviceinfoId,startDate,endDate,isVail);
end;
问题:在测试的时候发现 总提示月份无效
修改如下:
create or replace procedure P_AddDefaultService(
websiteId number ,
serviceinfoId number,
startDate varchar2,
endDate varchar2,
isVail number,
wbs_id out number) is
begin
wbs_id:=seq_websitebookservice.nextval;
insert into websitebookservice
(id,websitebaseinfoid, serviceinfoid, startservicedate,endservicedate, isavail)
values
(wbs_id,websiteId, serviceinfoId,to_date(startDate,'yyyy-mm-dd'), to_date(endDate,'yyyy-mm-dd'), isVail);
end;
接着又发生错误:日期格式图片在转换整个输入字符串之前结束
1、错误原因:
date类型不能包含秒以后的精度。
如日期:2010-01-01 20:02:20.0
解决方法:将日期秒以后的精度去除
如日期:2010-01-01 20:02:20
2、INSERT INTO TEST2 (C1, C2,c3) VALUES (${v1},${v2},to_date(${v3},'yyyy-mm-dd'));
oracle里面不需要以“;”结尾。
3、修改数据库日期格式:
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'
这个命令的适用范围,是修改当前SESSION,另外这不能修改第三方工具的日期格式,如:PL/SQL DEVELOPER需要在Tools->Preferences->User Interface->Date/Time下修改格式即可,第三方工具的日期格式在工具内部自己去设置,我估计你也应该在第三方工具下才会看到这样的效果,一般默认情况下ORACLE默认的日期格式不是这样的。
在默认的sqlplus或者sqlplusw下或者程序编写过程中,执行该命令后,如果是同一个session是肯定会产生你要的效果。
如果要将整体的数据库级别默认格式改掉需要修改参数文件,并重启数据库才可以,但是这个也改不掉你第三方工具的显示格式,第三方工具只能在工具内部去改,它只能改掉默认的日期格式,第三方工具都是转换后的;但是很多时候容易被工具所忽悠,给人的感觉就是数据库就是这样存储的,其实存储的只有日期格式,没有YYYYMM这些东西,这些东西都是通过算法计算出来的结果,然后根据格式要求进行对应的格式化给看到的这样的效果而已。
4、INSERT INTO TEST2 (C1, C2,c3) VALUES ('1',1,to_date('2010-12-27 00:00:00','yyyy-mm-dd')) 不可以
INSERT INTO TEST2 (C1, C2,c3) VALUES (1,1,to_date('2010-12-27 00:00:00','yyyy-mm-dd hh24:mi:ss')) 可以
to_date是类型转换,不是格式转换,字符串和后面的格式要匹配;to_char才是转成对应格式;
我发现我遇到的问题是第一个:在程序传值的时候 要 startDate.ToString("yyyy-MM-dd");
3.接下来又有问题了 oracle返回的ID和数据库的ID不一致,差一
create or replace procedure P_AddDefaultService(
websiteId number ,
serviceinfoId number,
startDate varchar2,
endDate varchar2,
isVail number,
wbs_id out number) is
begin
wbs_id:=seq_websitebookservice.nextval;
insert into websitebookservice
(id,websitebaseinfoid, serviceinfoid, startservicedate,endservicedate, isavail)
values
(wbs_id,websiteId, serviceinfoId,to_date(startDate,'yyyy-mm-dd'), to_date(endDate,'yyyy-mm-dd'), isVail);
end;
最近在项目中遇到一个问题,因为用的是ORACLE数据库,所以有一些表是建立了序列和触发器来使添加进去的数据ID自动增加1.因为有一个操作是同时保存几个表的数据,所以就要用到先插入数据的id存到另一个表中。
奇怪的现象发生了:返回的ID,和数据库中的ID不对应,都是相差1.例如 返回的是259,数据库中就是260.经过排查发现是trigger触发器的问题,因为hibernate中的model层ID映射的是序列名称,所以保存的时候hibernate先自增了一,然后到数据库中,又调用trigger,所以数据库中ID自增就为2了,自增了两次。
当然还有一些疑问,不过现在的解决方案是把数据库中的trigger删除掉了就解决了。ID就会对应了
或者 这样修改:
create or replace procedure P_AddDefaultService(
websiteId number ,
serviceinfoId number,
startDate varchar2,
endDate varchar2,
isVail number,
wbs_id out number) is
begin
insert into websitebookservice
(websitebaseinfoid, serviceinfoid, startservicedate,endservicedate, isavail)
values
(websiteId, serviceinfoId,to_date(startDate,'yyyy-mm-dd'), to_date(endDate,'yyyy-mm-dd'), isVail);
wbs_id:=seq_websitebookservice.currval;
end;