DECLARE
    v_f_name employees.first_name%TYPE;
    v_j_id   employees.job_id%TYPE;
    CURSOR c1       --声明游标,没有参数没有返回值
    IS
       SELECT first_name, job_id FROM employees 
       WHERE department_id = 20;
 BEGIN
    OPEN c1;        --打开游标
    LOOP
       FETCH c1 INTO v_f_name, v_j_id;    --提取游标
       IF c1%FOUND THEN
          DBMS_OUTPUT.PUT_LINE(v_f_name||'的岗位是'||v_j_id);
       ELSE
          DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');
          EXIT;
       END IF;
    END LOOP;
    CLOSE c1;   --关闭游标
 END;DECLARE
    TYPE emp_record_type IS RECORD(
         f_name   employees.first_name%TYPE,
         h_date   employees.hire_date%TYPE);
    v_emp_record EMP_RECORD_TYPE;
 
   CURSOR c3(dept_id NUMBER, j_id VARCHAR2) --声明游标,有参数有返回值
           RETURN EMP_RECORD_TYPE --???????
    IS
       SELECT first_name, hire_date FROM employees
       WHERE department_id = dept_id AND job_id = j_id;
 BEGIN
    OPEN c3(j_id => 'AD_VP', dept_id => 90);  --打开游标,传递参数值
    LOOP
       FETCH c3 INTO v_emp_record;    --提取游标
       IF c3%FOUND THEN
          DBMS_OUTPUT.PUT_LINE(v_emp_record.f_name||'的雇佣日期是'
                             ||v_emp_record.h_date);
       ELSE
          DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');
          EXIT;
       END IF;
    END LOOP;
    CLOSE c3;   --关闭游标
 END;我刚学游标,看到上面的2例子,感觉这行 RETURN EMP_RECORD_TYPE  有写和没写不是一样的吗?
想问前辈,我的理解是不是错了,还是下面的例子我还没懂或它没体现,
谢谢!

解决方案 »

  1.   

    是不一样的哦。
    看这里
    DBMS_OUTPUT.PUT_LINE(v_emp_record.f_name||'的雇佣日期是'
                                 ||v_emp_record.h_date);
    因为这里用到了这种类型点他的属性。所以只能返回这种类型的,也就是说只能返回
    RETURN EMP_RECORD_TYPE 
    你看这FETCH c3 INTO v_emp_record如果你不写
    RETURN EMP_RECORD_TYPE 
    那么这个游标open了以后你的
    fetch语句就不能这么写了,就是先声明两个集合
    v_name   employees.first_name%TYPE
    v_data employees.hire_date%TYPE
    然后fetch就会变成这样
    fetch c3 into v_name,v_date;
    而且下面的操作也就变啦,不能再是
    DBMS_OUTPUT.PUT_LINE(v_emp_record.f_name||'的雇佣日期是'
                                 ||v_emp_record.h_date);
    而应该改成
    DBMS_OUTPUT.PUT_LINE(v_name||'的雇佣日期是'
                                 ||v_date);
    明白了没?
      

  2.   

    DECLARE
       CURSOR c3(dept_id NUMBER, j_id VARCHAR2) --声明游标,有参数有返回值
        IS
           SELECT first_name, hire_date FROM employees
           WHERE department_id = dept_id AND job_id = j_id;
        v_emp_record c3%rowtype; --去掉return这样声明     
     BEGIN
        OPEN c3(j_id => 'AD_VP', dept_id => 90);  --打开游标,传递参数值
        LOOP
           FETCH c3 INTO v_emp_record;    --提取游标
           IF c3%FOUND THEN
              DBMS_OUTPUT.PUT_LINE(v_emp_record.first_name||'的雇佣日期是'
                                 ||v_emp_record.hire_date);
           ELSE
              DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');
              EXIT;
           END IF;
        END LOOP;
        CLOSE c3;   --关闭游标
     END;
    /