天天看點

Oracle顯式遊标小例子

1:遊标執行個體,顯示出姓名和部門

DECLARE

     name VARCHAR2(50);

     department_name varchar(20);   --定義兩個變量來存放employees表和departments表中的内容

     CURSOR emp_cur IS   --定義遊标emp_cur

              SELECT name, department_name

              FROM employees e, departments d

              WHERE e.department_id = d.department_id;   --選出所有員工的姓名和所在部門

     BEGIN

           OPEN emp_cur;    --打開遊标

           LOOP

                  FETCH  emp_cur INTO name, department_name;   --每次将一行資料放入到變量中,遊标後移

                  EXIT  WHEN emp_cur%NOTFOUND;   --當遊标取不到資料時退出循環

                  dbms_output.put_line(name || ' 在 ' || department_name);   --輸出姓名和所在部門

          END LOOP;

          CLOSE emp_cur;

  END;

2:第二個例子,

   公司上市,決定給員工提高薪資,入職時間沒超過1年漲100,1000元封頂

   DECLARE

      hire_date DATE;      --定義2個變量存放employee表中的内容

      e_id  NUMBER;

      CURSOR emp_cur IS       --定義遊标emp_cur

          SELECT id, hire_date

           FROM employees;        --選出所有員工的姓名和入職時間

       BEGIN

            OPEN emp_cur;    --打開遊标

           LOOP

                FETCH emp_cur INTO e_id, hire_date;    --每次将一行資料存入變量中,遊标後移

                EXIT WHEN emp_cur % NOTFOUND;

                IF 100*(2010 - to_char(hire_date, 'yyyy')) < 1000 THEN      --判斷年限和工資的關系

                   UPDATE salary

                    SET salaryvalue = salaryvalue + 100*(2010 - to_char(hire_date, 'yyyy'))

                    WHERE employeeid = e_id;

               ELSE

                    UPDATE salary

                    SET salaryvalue = salaryvalue + 1000;

                    WHERE employeeid = e_id;

                END IF;

              END LOOP;

      END;

3:使用循環遊标簡化遊标的讀取

    文法:

         FOR  <類型>  IN  <遊标名>  LOOP

         --操作各行資料

        END LOOP;

      例子:

     DECLARE 

           TYPE  employee_record IS  RECORD    --定義一個RECORD類型的變量,裡面包含name和department_name兩個變量

             (

                  name VARCHAR2(50),

                  department_name varchar(20)

             );

             CURSOR  emp_cur IS 

                      SELECT name, department_name

                     FROM employee e, departments d

                     WHERE e.department_id = d.department_id;

            BEGIN

                 FOR  employee_record IN emp_cur LOOP

                 dbms_output.put_line

                     (employee_record.name || ' 在 ' || employee_record.department_name);

繼續閱讀