做项目遇到的oracle问题

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值