请问下面两个游标在使用中的性能有什么区别吗?
--cursor 1
SET SERVERIUTPUT ON 
DECLARE 
R_emp EMP%ROWTYPE; 
CURSOR c_emp IS SELECT * FROM emp; 
BEGIN 
  OPEN c_emp; 
   LOOP 
     FETCH c_emp INTO r_emp; 
     EXIT WHEN c_emp%NOTFOUND; 
     DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary); 
   END LOOP; 
  CLOSE c_emp; 
END;  -- cursor 2
SET SERVERIUTPUT ON 
DECLARE 
R_emp EMP%ROWTYPE; 
CURSOR c_emp IS SELECT * FROM emp; 
BEGIN 
FOR C_emp IN R_emp
   LOOP  
     DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||C_emp.ename||'is'|| C_emp.salary); 
   END LOOP; 
END;  

解决方案 »

  1.   

    请问下面两个游标在使用中的性能有什么区别吗?
    --cursor 1
    SET SERVERIUTPUT ON
    DECLARE
    R_emp EMP%ROWTYPE;
    CURSOR c_emp IS SELECT * FROM emp;
    BEGIN
      OPEN c_emp;
      LOOP
        FETCH c_emp INTO r_emp;
        EXIT WHEN c_emp%NOTFOUND;
        DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);
      END LOOP;
      CLOSE c_emp;
    END; -- cursor 2
    SET SERVERIUTPUT ON
    DECLARE
    CURSOR R_emp IS SELECT * FROM emp;
    BEGIN
    FOR C_emp IN R_emp
      LOOP 
        DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||C_emp.ename||'is'|| C_emp.salary);
      END LOOP;
    END; 
      

  2.   

    第二个游标没有open和close,这样对数据库性能有没有影响呢?
      

  3.   

    for 要比loop方便不用open不用close不用fetch 而且用for可以不定义游标。
    FOR C_emp IN (SELECT * FROM emp)
      LOOP 
        DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||C_emp.ename||'is'|| C_emp.salary); 
      END LOOP; 
    这里就没定义游标。