ORA-01008: 并非所有变量都已绑定

24 篇文章 0 订阅
5 篇文章 0 订阅

oracle提示,并非所有变量都已绑定。sql语句很长很长,我就不贴出来了。经过仔细分析,感觉应该是传入sql的变量没有在sql语句中对应上相应参数造成。但是分析,大部分的传入参数都是等于方式。
比如像这样:
oracle语句: where rcc.customerunitcode = :customerunitcodevalue 
而相应的oracle参数是这样:  parlist.Add(new OracleParameter("customerunitcodevalue",Customerunitcode));
这种应该不会错。然后就还有另外一种,感觉可能有问题。
and (rcc.OPDT between :startDateTime and :endDateTime) and rcc.acccode=202 
就是这种between and方式的sql语句,而且opdt是日期类型的变量

为了试验,我把 :startDateTime和 :startDateTime直接替换为日期类型的字符串,来进行调试。替换后是这样的

and (rcc.OPDT between '2019-07-28 19:00:00' and '2019-07-29 19:00:00') and rcc.acccode=202 

这在sqlserver中是完全允许的。但是提示是:ORA-01861: 文字与格式字符串不匹配
有了这个提示,而不是并非所有变量都已绑定,最起码证明了一点,这个问题就是因为between and 这个地方的日期格式不正确造成,由于日期格式不正确,导致oracle认为这个变量的绑定有问题,所以才提示并非所有变量都已绑定。

在网上找到oracle日期格式的写法:
and (rcc.OPDT between to_date('2019-07-28 19:00:00','YYYY-MON-DD HH24:MI:SS') and to_date('2019-07-29 19:00:00','YYYY-MON-DD HH24:MI:SS')) and rcc.acccode=202 

提示:ORA-01843: 无效的月份
这个网上说是因为传入的变量和数据库中使用的日期格式不一致造成。而数据库中存入opdt的日期格式为:31-8月 -16  简体中文的日期格式
按这个来说应该这样写就可以:

and (rcc.OPDT between to_date('28-7月-2019 19:00:00','DD-MON-YYYY HH24:MI:SS') and to_date('29-7月-2019 19:00:00','DD-MON-YYYY HH24:MI:SS')) and rcc.acccode=202 

但是,因为这个实际是个传入的变量。而传入的变量是页面传入的,格式为:"StartDate":"2019-07-27T00:00:00"
因此这样写就不可以。最后经过多次尝试,最终的写法是这样:


and (rcc.OPDT between to_date('" + baseparam.StartDate.ToString("yyyy-MM-dd") + @"','yyyy-mm-dd') and to_date('" + baseparam.EndDate.ToString("yyyy-MM-dd") + @"','yyyy-mm-dd')) and rcc.acccode=201 

首先,这里的oracle函数必须使用to_date,而不能使用to_char,另外,这里不能写成传入参数形式,而只能使用字符串拼接方式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值