1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

Polardb运算符优化应用案例

Polardb运算符优化应用案例

我是本际云服务器推荐网的小编小本本,今天要给大家分享的是一篇Polardb运算符优化应用案例。在使用Polardb时,可能会遇到像下面这样的错误:

Polardb运算符优化应用案例

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar[SELECT TO_CHAR(TRUNC(SYSDATE,dd)-TRUNC(op_time,dd)) over day FROM tb_xxx_xxxx WHERE case no=?]; nested exception is com.aliyun.polardb.util.PSQLException: ERROR: function to_char(interval) does not exist Hint: No function matches the given name and argument types. You might need to add explicit type casts.

造成这个问题出现的原因是在Polardb执行Oracle执行报错信息需要类型转换,而代码里没有进行相应的类型转换。

解决方案

经过排查,我们可以看到查询实现原理如下:

  1. trunc后返回类型是timestamp without timezone。
  2. 两个相减返回值类型是interval。
  3. 查看to_char输入和输出返回类型。

因为应用侧整改工作量大,我们需要在第1步或第2步上做文章。

具体解决步骤如下:

  1. 实现日期格式相减功能的sql:SELECT (date_part(epoch,sysdate)-date_part(epoch,sysdate-10))/86400,pg_typeof(date_part(epoch,sysdate)-date_part(epoch,sysdate-10)/86400);
  2. 创建实现上述功能的函数:create or replace function ywjhxt.timestamp_mi(timestamp without timezone,timestamp without timezone) returns double precision as $$ SELECT (date_part(epoch,$1)-date_part(epoch,$2))/86400; $$ language sql;
  3. 创建新的运算符实现逻辑:create operator ywjhxt.- (leftarg=timestamp without timezone, rightarg=timestamp without timezone, procedure=ywjhxt.timestamp_mi);
  4. 检验是否实现了功能。
  5. 意外情况处理:为什么没有生效?经过分析我们发现有两个timestamp without timezone的值进行相减时,有两个实现方式,我们需要将搜索路径设置为正确的路径。

总结

通过上面的方法,我们成功地解决了Polardb运算符优化应用的问题,避免了大量的工作量和进度受到影响。期望这篇文章对正在使用Polardb的同学们有所帮助。

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/5860.html