Hi,
I've been hearing from other developers and DBAs from some time now that doing a
SELECT INTO variable
is slower than doing
OPEN CURSOR FETCH curson_name INTO variable CLOSE CURSOR
I wasn't convinced, I think letting Oracle do the implicit openning and fetching of the cursor is more efficient. But I've been told that Oracle does a
SELECT COUNT(condition)
before doing the
SELECT INTO variable
to check if the query returns 1 and only 1 row.
So I did a small test on EMP
TONY@RIM> DECLARE
2 V_DESC EMP.ENAME%TYPE;
3 BEGIN
4 SELECT ENAME INTO V_DESC
5 FROM EMP
6 WHERE EMPNO = 7788;
7 DBMS_OUTPUT.PUT_LINE(V_DESC);
8 END;
9 /
SCOTT
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00
TONY@RIM> DECLARE
2 V_DESC EMP.ENAME%TYPE;
3 CURSOR C_ENAME IS SELECT ENAME INTO V_DESC
4 FROM EMP
5 WHERE EMPNO = 7788;
6 BEGIN
7 OPEN C_ENAME;
8 FETCH C_ENAME INTO V_DESC;
9 CLOSE C_ENAME;
10 DBMS_OUTPUT.PUT_LINE(V_DESC);
11 END;
12 /
SCOTT
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00
and no difference, so I did another test on a table with duplicate rows and almost 1 million records.
TONY@RIM> DECLARE
2 V_DESC ISTD_STOCK_MOUVEMENTS_M.MVTS_B_DESC%TYPE;
3 BEGIN
4 SELECT MVTS_B_DESC INTO V_DESC
5 FROM ISTD_STOCK_MOUVEMENTS_M
6 WHERE MVTS_DOC_NUM = 215375
7 AND TMVS_CODE = 'I'
8 AND MVTS_YEAR = 2005;
9 DBMS_OUTPUT.PUT_LINE(V_DESC);
10 END;
11 /
LEADERS PRODUCTION (HOME +ETS.) / ACHR. 50108
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00
TONY@RIM> DECLARE
2 V_DESC ISTD_STOCK_MOUVEMENTS_M.MVTS_B_DESC%TYPE;
3 CURSOR C_DESC IS
4 SELECT MVTS_B_DESC
5 FROM ISTD_STOCK_MOUVEMENTS_M
6 WHERE MVTS_DOC_NUM = 215375
7 AND TMVS_CODE = 'I'
8 AND MVTS_YEAR = 2005;
9 BEGIN
10 OPEN C_DESC;
11 FETCH C_DESC INTO V_DESC;
12 CLOSE C_DESC;
13 DBMS_OUTPUT.PUT_LINE(V_DESC);
14 END;
15 /
LEADERS PRODUCTION (HOME +ETS.) / ACHR. 50108
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00
TONY@RIM>
Again no difference.
Can anybody shed some light on this issue? IS it true explicit cursors are faster and better to use rather than SELECT INTO??
Regards,
Tony Garabedian