ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PL/SQL中显式游标的使用

PL/SQL中显式游标的使用

原创 Linux操作系统 作者:pennypengy 时间:2011-04-30 14:48:02 0 删除 编辑
1.DECLARE
     v_locid NUMBER := 1700;
     CURSOR c_emp_cursor IS
        SELECT employee_id,last_name FROM employees
        WHERE department_id=v_locid;
        v_empno emplouees.employee_id%TYPE;
        v_lname employees.last_name%TYPE;
             //  v_emp_record c_emp_cursor%ROWTYPE;  使用记录
     BEGIN
        OPEN c_emp_cursor;
        LOOP
            FETCH c_emp_cursor INTO v_empno,v_lname;
             //   FETCH c_emp_cursor INTO v_emp_record;
            EXIT WHEN c_emp_cursor%NOTFOUND;
            DBMS_OUTPUT.PUT_LINE(vemp_record.employee_id || ' ' || v_emp_record.last_name);
        END LOOP;
        CLOSE c_emp_cursor;
   END;
  
2.游标FOR循环
   FOR record_name IN cursor_name
    LOOP
       statement1;
       statement2;
       ...
    END LOOP;
    在游标FOR循环中,游标可以被隐式的打开,提取,退出和关闭,且记录也可以被隐式的声明。
    
   例:DECLARE
           CURSOR c_emp_cursor IS
              SELECT employee_id,last_name,ROM employees
              WHERE department_id=30;
       BEGIN
           FOR emp_record IN c_emp_cursor
             LOOP
               DBMS_OUTPUT.PUT_LINE(emp_record.employee_id || ' ' || emp_record.last_name);
             END LOOP;
       END;
       /
    在FOR 循环中游标的定义也可以省略,上述代码可以简化为:
       BEGIN
           FOR emp_record IN (SELECT employee_id,last_name FROM employees WHERE department_id=30)
             LOOP
               DBMS_OUTPUT.PUT_LINE(emp_record.employee_id ||' '||emp_record.last_name);
             END LOOP;
        END;
        /
 
3. 游标的属性
   %ISOPEN:判断游标是不是被打开;
        IF NOT c_emp_cursor%ISOPEN THEN
           OPEN c_emp_cursor;
        END IF
        LOOP
          FETCH c_emp_cursor
   %NOTFOUND:如果最近一次抓取记录的操作没有返回值,为TRUE;
   %FOUND:如果最近一次抓取记录的操作有返回值,为TRUE;
   %ROWCOUNT:每FETCH一次,次数加一。
        EXIT WHEN c_emp_cursor%ROWCOUNT > 10 OR c_emp_cursor%NOTFOUND;
       
4.游标的高级用法--带参数的游标:
      DECLARE
          CURSOR c_emp_cursor(deptno NUMBER) IS
             SELECT employee_id,last_name
             FROM employees
             WHERE department_id = deptno;
             ...
      BEGIN
          OPEN c_emp_cursor(10);
          ...
          CLOSE c_emp_cursor;
          OPEN c_emp_cursor(20);
          ...
         
5.FOR UPDATE子句用来锁定查询出来的记录用于以后修改。
      SELECT ...
      FROM
      FOR UPDATE [OF column_reference][NOWAIT | WAIT n];
     
6.WHERE CURRENT OF子句用来修改游标的内容=修改表的内容。
      UPDATE employees
         SET salary = ...
         WHERE CURRENT OF c_emp_cursor;
        
7.批量导入 BULK COLLECT
  例:不使用游标
       DECLARE
           TYPE emp_type IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;
           l_emp emp_type;
           l_row PLS_INTEGER;
       BEGIN
           SELECT * BULK COLLECT INTO l_emp FROM employees;
          
           DBMS_OUTPUT.PUT_LINE('The count is:' || l_emp.COUNT);
          
           l_row := l_emp.FIRST;
           WHILE(l_row IS NOT NULL)
           LOOP
             DBMS_OUTPUT.PUT_LIN(l_row||':'||l_emp(l_row).employee_id||'-->'||l_emp(l_row).first_name);
             l_row := l_emp.NEXT(l_row);
           END LOOP;
        END;
        /
        使用游标的情况:
      DECLARE
           CURSOR e IS SELECT * FROM employees;
           TYPE emp_type IS TABLE OF e%ROWTYPE INDEX BY PLS_INTEGER;
           l_emp emp_type;
           l_row PLS_INTEGER;
       BEGIN
           OPEN e;
           FETCH e BULK COLLECT INTO l_emp;
           CLOSE E;
          
           DBMS_OUTPUT.PUT_LINE('The count is:' || l_emp.COUNT);
          
           l_row := l_emp.FIRST;
           WHILE(l_row IS NOT NULL)
           LOOP
             DBMS_OUTPUT.PUT_LIN(l_row||':'||l_emp(l_row).employee_id||'-->'||l_emp(l_row).first_name);
             l_row := l_emp.NEXT(l_row);
           END LOOP;
        END;
        /

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22012035/viewspace-694166/,如需转载,请注明出处,否则将追究法律责任。

上一篇: SQL组函数
下一篇: 复合查询操作
请登录后发表评论 登录
全部评论

注册时间:2011-04-17

  • 博文量
    20
  • 访问量
    24951