テーブル内のSQLステートメントの実行時間を節約するプロシージャを作成する必要があります。
プロシージャはexec measuresqltime('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 cursor 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の最後の行にフェッチするのに必要な時間を測定することに注意してください。
devosJavaを完了すると答えました...夜明けに使用しないでください; P
PROCEDURE MY_PROCEDURE IS
timeStart TIMESTAMP;
timeEnd TIMESTAMP;
timeSecond NUMBER
BEGIN
timeStart := SYSTIMESTAMP;
-- YOUR CODE HERE
timeEnd := SYSTIMESTAMP;
timeSecond :=((extract(hour from timeEnd)*3600)+(extract(minute from timeEnd)*60)+extract(second from timeEnd))-((extract(hour from timeStart)*3600)+(extract(minute from timeStart)*60)+extract(second from timeStart));
dbms_output.put_line('finished: '||timeSecond||' seconds');
END MY_PROC;
実行時間の期間を計算するには
PROCEDURE MY_PROCEDURE IS
timeStart TIMESTAMP;
timeEnd TIMESTAMP;
BEGIN
timeStart := SYSTIMESTAMP;
-- YOUR CODE HERE
timeEnd := SYSTIMESTAMP;
INSERT INTO PROC_RUNTIMES (PROC_NAME, START_TIME, END_TIME)
VALUES ('MY_PROCEDURE ', timeStart , timeEnd );
END MY_PROC;
INSERT INTO PROC_RUNTIMES(PROC_NAME、START_TIME、END_TIME)VALUES( 'PROC_NAME'、TO_CHAR(SYSDATE、 'DD/MM/YYYY HH24:MI:SS')、NULL);
ここであなたの質問;
INSERT INTO PROC_RUNTIMES(PROC_NAME、START_TIME、END_TIME)VALUES( 'PROC_NAME'、NULL、TO_CHAR(SYSDATE、 'DD/MM/YYYY HH24:MI:SS'));