PL/SQL:如何运行存储在表列中的sql语句来获取sql语句的执行时间?

Posted

技术标签:

【中文标题】PL/SQL:如何运行存储在表列中的sql语句来获取sql语句的执行时间?【英文标题】:PL/SQL : How to run the sql statements stored within a column of the table to get the execution time of the sql statement? 【发布时间】:2014-04-27 11:47:15 【问题描述】:

我在编写我的 pl sql 脚本时遇到了一些困难。这是场景:

我的表 A 有 2 列,即第 1 列(varchar),第 2 列(varchar),如下所示。

Table A

       Column 1              Column 2
Row 1   a               select * from table_one
Row 2   b               select * from table_two 
Row 3   c               select * from table_three

我创建了一个包:pg_creating_package,其中包含一个主函数func_loop,它最终将循环在表的每一行中,并一一执行存储在第2列中的每个sql,并将所花费的时间插入到最终表B中示例:

Table B

              Start time               End time       Time Taken
Row 1   27/04/2014 12:33:44   27/04/2014 12:35:44       2mins  
Row 2   27/04/2014 12:33:44   27/04/2014 12:33:45       1sec

等等……

我的问题是: 1. 我将如何运行存储在该列中的 sql 语句? 2. 如何获取sql语句的开始时间? 3. 如何获取sql语句的结束时间?

【问题讨论】:

【参考方案1】:

您可以使用 EXECUTE IMMEDIATE 'your select statement'DBMS_SQL.EXECUTE 。 要记录执行时间,请获取EXECUTE IMMEDIATE 之前和之后的时间。

DECLARE   
start_time TIMESTAMP;  
end_time TIMESTAMP;  
BEGIN  
 ....
 start_time := SYSTIMESTAMP;  
 EXECUTE IMMEDIATE '....';  
 end_time := SYSTIMESTAMP;  
 .....  
END;

您可能希望使用DBMS_UTILITY.GET_TIME 代替日期时间/时间戳

【讨论】:

谢谢.. 我已经尝试了您的建议,但收到以下错误:PLS-00382 事实上我的函数 func_loop 正在返回 NUMBER。但我认为以下语句返回类型 DATE。 diff_time := mod(trunc(24 * 60 * (end_time - start_time)), 60); diff_time 是 end_time 和 start_time 之间的差异你知道如何进行吗? end_timestart_time 的类型是什么? trucn 不适用于 TIMESTAMP,仅适用于 DATE。投射到日期,或使用dbms_utility.get_time,这更精确,尤其是在小间隔时。 end_time 和 start_time 是数字类型。 start_date 和 end_date 是 date 类型,因为我希望显示日期本身。 diff_time 是从 start_time 到 end_time 的时间。开始日期:= SYSTIMESTAMP;开始时间:= DBMS_UTILITY.get_time;立即执行“.....”;结束日期:= SYSTIMESTAMP; end_time := DBMS_UTILITY.get_time; diff_time := round( (end_time - start_time) / 100, 2);还是不行!

以上是关于PL/SQL:如何运行存储在表列中的sql语句来获取sql语句的执行时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何存储和调用表列中的 sql 查询?

将 XML 数据存储在表中的 PL/SQL 过程抛出错误(23,102):PL/SQL:ORA-00907:缺少右括号

如何使用 PL/SQL 中的过程在表中插入多个值?

变量作为 Oracle PL/SQL 中 where 子句中的列名

PL/SQL自定义函数

如何从 SQL 查询中的 CREATE/UPDATE/INSERT 语句中提取表名?