2017-11-15 3 views
0

このカーソルの実行時間を把握しようとしています。しかし、私は同じ開始時間と終了時間を得ています。Oracle Open Cursor実行時間

実際のSQL文は含まれていません。しかし、実行にはかなりの時間がかかることは確かです。

PROCEDURE GetData (p1 IN VARCHAR2,myREFCURSOR OUT SYS_REFCURSOR) 
IS 
    DynamicStatement  CLOB; 
BEGIN 
    INSERT INTO TimeTable VALUES ('StartTime',SYSDATE); 
    COMMIT; 

    OPEN myREFCURSOR FOR DynamicStatement; 

    INSERT INTO TimeTable VALUES ('EndTime',SYSDATE); 
    COMMIT; 
END; 

答えて

2

Ref Cursorは、クエリが格納されているメモリチャンクへのポインタです。 1つを開く操作は単なる割り当て操作であり、クエリを実行しません。だから、まったく時間がかからないように見えるのです。

実際のクエリを実行するのにかかる時間を確認するには、レコードをいくつかのレコード変数にFETCHする必要があります。

PROCEDURE GetData (p1 IN VARCHAR2,myREFCURSOR OUT SYS_REFCURSOR) 
IS 
    DynamicStatement  CLOB; 
    type rec is record (id number, blah varchar2(128)); 
    lrec rec; 
BEGIN 
    INSERT INTO TimeTable VALUES ('StartTime',SYSDATE); 
    COMMIT; 

    OPEN myREFCURSOR FOR DynamicStatement; 

    loop 
     fetch myREFCURSOR into rec; 
     exit when myREFCURSOR%notfound; 
    end loop; 
    close myREFCURSOR; 

    INSERT INTO TimeTable VALUES ('EndTime',SYSDATE); 
    COMMIT; 
END; 

明らかに、レコード変数はクエリの投影と一致する必要があります。 DynamicStatementを実行していると、それは難しいかもしれません。