Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Excplicit cursor vs SELECT INTO

Tony GarabedianSep 10 2005 — edited Sep 10 2005

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

Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Oct 8 2005
Added on Sep 10 2005
1 comment
987 views