我的目标是dbms_output pl / sql块内的时间差(以毫秒为单位),如代码所示。现在,dbms_output结果为0,这不是真的。我知道我必须应用一些转换函数才能获得正确的时差,但我无法解决它。谁可以帮我这个事?我非常感谢你的帮助!
create table city
(cityid numeric(10),
cityname varchar2(20),
cityregion VARCHAR(20),
citypopulation INT,
constraint city_pk primary key (cityid));
declare
c_id number := 0 ;
c_name varchar2(30) ;
c_region varchar2(30);
c_pop number;
cityid_copy city.cityid%TYPE;
time_before timestamp;
time_after timestamp;
begin
while (c_id <= 30000000)
loop
c_name := 'City' || c_id;
c_region := 'Region' || c_id;
c_pop := c_id + 500;
insert into city
(cityid,cityname,cityregion,citypopulation)
values(c_id,c_name,c_region,c_pop);
c_id := c_id +1;
end loop;
time_before := systimestamp;
select cityid into cityid_copy from city
where cityid = 3000000;
time_after := systimestamp;
dbms_output.put_line((time_after)-(time_before));
end;
答案 0 :(得分:0)
代码比操作系统时间戳精度快。在许多操作系统上SYSTIMESTAMP
只精确到千分之一秒。
SQL> select to_char(systimestamp, 'FF9') fractional_seconds from dual;
FRACTIONA
---------
711000000
SQL> select to_char(systimestamp, 'FF9') fractional_seconds from dual;
FRACTIONA
---------
715000000
SQL> select to_char(systimestamp, 'FF9') fractional_seconds from dual;
FRACTIONA
---------
718000000
如果您将dbms_lock.sleep(0.1);
添加到代码中,结果将不再为零。
据我所知,这个问题没有解决方法。在这些平台上,没有办法测量不到千分之一秒的东西。虽然如果真的花了很多时间,那么它可能无论如何都不需要进行测量。