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_time
和 start_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语句的执行时间?的主要内容,如果未能解决你的问题,请参考以下文章
将 XML 数据存储在表中的 PL/SQL 过程抛出错误(23,102):PL/SQL:ORA-00907:缺少右括号