梧桐云原生分析型数据库UDF函数中系统时间异常如何解决

1、背景

       sysdate函数是非常实用且常见的系统内置函数,尤其是在ORACLE 和 MySql 数据库中广泛使用。主要用来获取服务器当前的日期和时间,这对于进行实时数据记录、审计跟踪、有效期计算等场景特别有用。sysdate函数返回的是函数被调用时数据库服务器的当前日期和时间。这也意味这每次sysdate被执行,都会得到最新的时间值,所以常用来在函数执行时,根据系统时间定位执行函数中的SQL的运行时长。而在梧桐云原生分析型数据库的UDF函数中多次调用sysdate和now函数得到的服务器时间一样,影响业务的正产运行。

2、UDF函数中测试sysdate和now函数

2.1 封装UDF函数

create or replace function UDF1()
returns text as
$$
declare
time1 timestamp;
time2 timestamp;
time3 timestamp;
time4 timestamp;
BEGIN
–sysdate函数使用
select sysdate() into time1;
–暂停10秒
perform pg_sleep(10);
select sysdate() into time2;
–now函数使用
select now() into time3;
–暂停10秒
perform pg_sleep(10);
select now() into time4;
–打印出时间
raise info ‘time1:%’,time1;
raise info ‘time2:%’,time2;
raise info ‘time3:%’,time3;
raise info ‘time4:%’,time4;
return null;
end;
$$ language plpgsql ;

2.2 测试UDF函数

UDF_01.png

结论:UDF函数中属于一个事物,在一个事务中sysdate()和now()获取服务器当前的时间是一致的,是事务开始的时间,无法从日志层面看到sql的运行时长,影响业务的正常运行。

3、解决方法

3.1 代替函数

       用timeofday()来代替sysdate()和now()函数。

3.1 具体实现

create or replace function UDF2()
returns text as
$$
declare
time1 timestamp;
time2 timestamp;
BEGIN
** select timeofday()::timestamp into time1; **
–暂停10秒
perform pg_sleep(10);
**select timeofday()::timestamp into time2; **
–打印出时间
raise info ‘time1:%’,time1;
raise info ‘time2:%’,time2;
return null;
end;
$$ language plpgsql ;

UDF_02.png

4 测试结论

      在梧桐云原生分析型数据库的UDF函数中sysdate()和now()函数可以使用timeofday()来代替使用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值