다음과 같은 구문을 실행합니다.
declare
ls_ename varchar2(10);
begin
for i in (select to_char(deptno) deptno from dept) loop
for j in (select * from emp where deptno = to_number(i.deptno)) loop
ls_name := j.ename;
end loop;
end loop;
end;
여기서 주목해서 보셔야 할 점은 두번째 for 안에 들어있는 암시적 커서입니다. 위의 pl/sql을 트레이스를 떠보면 다음과 같은 점을 볼 수 있습니다.
PARSING IN CURSOR #4 len=48 dep=1 uid=36 oct=3 lid=36 tim=9404653521 hv=1733623145 ad=’20ad35ac’
SELECT * FROM EMP WHERE DEPTNO = TO_NUMBER(:B1 ) => 한번만 파싱 되며 요청되는 값은 바인딩변수
END OF STMT
PARSE #4:c=0,e=73,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=9404653517
BINDS #4:
kkscoacd
Bind#0
oacdty=01 mxl=32(02) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1206001 frm=01 csi=873 siz=32 off=0
kxsbbbfp=046b6988 bln=32 avl=02 flg=05
value="10" => 필요한 변수만 바인딩이 되는 것을 알수가 있습니다.
EXEC #4:c=0,e=4258,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=9404661967
FETCH #4:c=0,e=123,p=0,cr=3,cu=0,mis=0,r=3,dep=1,og=1,tim=9404662556
BINDS #4:
kkscoacd
Bind#0
oacdty=01 mxl=32(02) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1206001 frm=01 csi=873 siz=32 off=0
kxsbbbfp=046b597c bln=32 avl=02 flg=05
value="20"
즉, sql 문 안에 함수가 포함되어 있다고 하더라도 한 번 parsing을 했을 경우 같은 hash value를 가지게 됩니다.
그 이후에는 sql을 날리는 환경이 변하지 않는 한, 그 실행계획을 계속 사용되어질 것입니다.