我必须编写一个过程来保存表中任何sql语句的执行时间.
该过程通过exec measureqltime调用(‘sql statement as string’);
我的想法是这样的:
--declarations timestart NUMBER; BEGIN dbms_output.enable; timestart:=dbms_utility.get_time(); EXECUTE IMMEDIATE sql COMMIT; dbms_output.put_line(dbms_utility.get_time()-timestart); -- save time
但它对我来说对SELECT * …子句不起作用. (我认为sql需要一个INTO订单)
有没有办法在程序中执行任何sql-atatements?
如果您的sql语句是SELECT,则需要从游标中获取以对其执行时间进行有意义的度量.
如果不从游标中获取,则只测量“解析”和“执行”阶段所花费的时间,而大部分工作通常在SELECT语句的“获取”阶段完成.
如果您不知道实际语句将具有的列数,则无法使用EXECUTE IMMEDIATE或OPEN游标FOR’string’进行提取.如果SELECT的列数/类型未知,则必须使用动态sql包DBMS_SQL
.
这是一个例子:
sql> CREATE OR REPLACE PROCEDURE demo(p_sql IN VARCHAR2) AS 2 l_cursor INTEGER; 3 l_dummy NUMBER; 4 timestart NUMBER; 5 BEGIN 6 dbms_output.enable; 7 timestart := dbms_utility.get_time(); 8 l_cursor := dbms_sql.open_cursor; 9 dbms_sql.parse(l_cursor,p_sql,dbms_sql.native); 10 l_dummy := dbms_sql.execute(l_cursor); 11 LOOP 12 EXIT WHEN dbms_sql.fetch_rows(l_cursor) <= 0; 13 END LOOP; 14 dbms_sql.close_cursor(l_cursor); 15 dbms_output.put_line(dbms_utility.get_time() - timestart); 16 END; 17 / Procedure created. sql> exec demo('SELECT * FROM dual CONNECT BY LEVEL <= 1e6'); 744 PL/sql procedure successfully completed.
请注意,这将测量获取SELECT的最后一行所需的时间.