文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>游标

游标

时间:2010-10-14  来源:ljh0242

  1.   
  2. 15-1:使用标量变量接收游标数据   
  3.     DECLARE   
  4.       CURSOR emp_cursor IS   
  5.         SELECT ename,job,sal FROM emp WHERE deptno=&dno;   
  6.       v_ename emp.ename%TYPE;   
  7.       v_sal emp.sal%TYPE;   
  8.       v_job emp.job%TYPE;   
  9.     BEGIN   
  10.       OPEN emp_cursor;   
  11.       LOOP   
  12.         FETCH emp_cursor INTO v_ename,v_job,v_sal;   
  13.         EXIT WHEN emp_cursor%NOTFOUND;   
  14.         dbms_output.put_line('姓名:'||v_ename||',岗位:'||v_job||',工资:'||v_sal);   
  15.       END LOOP;   
  16.       CLOSE emp_cursor;   
  17.     END;   
  18.     /   
  19. 15-2:使用pl/sql纪录变量接收游标数据   
  20.     DECLARE   
  21.       CURSOR emp_cursor IS   
  22.         SELECT ename,sal FROM emp ORDER BY sal DESC;   
  23.       emp_record emp_cursor%ROWTYPE;   
  24.     BEGIN   
  25.       OPEN emp_cursor;   
  26.       LOOP   
  27.         FETCH emp_cursor INTO emp_record;   
  28.         EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%ROWCOUNT>&n;   
  29.         dbms_output.put_line('姓名:'||emp_record.ename||   
  30.          ',工资:'||emp_record.sal);   
  31.       END LOOP;   
  32.       CLOSE emp_cursor;   
  33.     END;   
  34.     /   
  35. 15-3:使用pl/sql集合变量接收游标数据   
  36.     DECLARE   
  37.       CURSOR emp_cursor IS SELECT ename,sal FROM emp   
  38.         WHERE lower(job)=lower('&job');   
  39.       TYPE emp_table_type IS TABLE OF emp_cursor%ROWTYPE   
  40.         INDEX BY BINARY_INTEGER;   
  41.       emp_table emp_table_type;   
  42.       i INT;   
  43.     BEGIN   
  44.       OPEN emp_cursor;   
  45.       LOOP   
  46.         i:=emp_cursor%ROWCOUNT+1;   
  47.         FETCH emp_cursor INTO emp_table(i);   
  48.         EXIT WHEN emp_cursor%NOTFOUND;   
  49.         dbms_output.put_line('姓名:'||emp_table(i).ename||   
  50.           ',工资:'||emp_table(i).sal);   
  51.       END LOOP;   
  52.       CLOSE emp_cursor;   
  53.     END;   
  54.     /   
  55. 15-4:在游标for循环中引用已定义游标   
  56.     DECLARE   
  57.       CURSOR emp_cursor IS SELECT ename,hiredate FROM emp   
  58.         ORDER BY hiredate DESC;   
  59.     BEGIN   
  60.       FOR emp_record IN emp_cursor LOOP   
  61.         dbms_output.put_line('姓名:'||emp_record.ename   
  62.           ||',工作日期:'||emp_record.hiredate);   
  63.         EXIT WHEN emp_cursor%ROWCOUNT=&n;   
  64.       END LOOP;   
  65.     END;   
  66.     /   
  67. 15-5:在游标for循环中直接引用子查询   
  68.     BEGIN   
  69.       FOR emp_record IN (SELECT ename,hiredate,rownum FROM emp   
  70.         ORDER BY hiredate) LOOP   
  71.         dbms_output.put_line('姓名:'||emp_record.ename   
  72.          ||',工作日期:'||emp_record.hiredate);   
  73.         EXIT WHEN emp_record.rownum=&n;   
  74.       END LOOP;   
  75.     END;   
  76.     /   
  77. 15-6:参数游标   
  78.     DECLARE   
  79.       CURSOR emp_cursor(dno NUMBER) IS   
  80.         SELECT ename,job FROM emp WHERE deptno=dno;   
  81.     BEGIN   
  82.       FOR emp_record IN emp_cursor(&dno) LOOP   
  83.         dbms_output.put_line('姓名:'||emp_record.ename   
  84.           ||',岗位:'||emp_record.job);   
  85.       END LOOP;   
  86.     END;   
  87.     /   
  88. 15-7:更新游标行   
  89.     DECLARE   
  90.       CURSOR emp_cursor IS   
  91.         SELECT ename,sal,deptno FROM emp FOR UPDATE;   
  92.       dno INT:=&no;   
  93.     BEGIN   
  94.       FOR emp_record IN emp_cursor LOOP   
  95.         IF emp_record.deptno=dno THEN   
  96.            dbms_output.put_line('姓名:'||emp_record.ename   
  97.             ||',原工资:'||emp_record.sal);   
  98.            UPDATE emp SET sal=sal*1.1 WHERE CURRENT OF emp_cursor;   
  99.         END IF;   
  100.       END LOOP;   
  101.     END;   
  102.     /   
  103. 15-8:删除游标行   
  104.     DECLARE   
  105.       CURSOR emp_cursor IS   
  106.         SELECT ename FROM emp FOR UPDATE;   
  107.       name VARCHAR2(10):=lower('&name');   
  108.     BEGIN   
  109.       FOR emp_record IN emp_cursor LOOP   
  110.         IF lower(emp_record.ename)=name THEN   
  111.            DELETE FROM emp WHERE CURRENT OF emp_cursor;   
  112.         ELSE   
  113.            dbms_output.put_line('姓名:'||emp_record.ename);   
  114.         END IF;   
  115.       END LOOP;   
  116.     END;   
  117.     /   
  118. 15-9:使用of子句在特定表上加行共享锁.   
  119.     DECLARE   
  120.       CURSOR emp_cursor IS   
  121.         SELECT a.dname,b.ename FROM dept a JOIN emp b   
  122.         ON a.deptno=b.deptno   
  123.         FOR UPDATE OF b.deptno;   
  124.       name VARCHAR2(10):=LOWER('&name');   
  125.     BEGIN   
  126.       FOR emp_record IN emp_cursor LOOP   
  127.         IF LOWER(emp_record.dname)=name THEN   
  128.           dbms_output.put_line('姓名:'||emp_record.ename);   
  129.           DELETE FROM emp WHERE CURRENT OF emp_cursor;   
  130.         END IF;   
  131.       END LOOP;   
  132.     END;   
  133.     /   
  134. 15-10:使用无返回类型的游标变量   
  135.     DECLARE   
  136.       TYPE ref_cursor_type IS REF CURSOR;   
  137.       ref_cursor ref_cursor_type;   
  138.       v1 NUMBER(6);   
  139.       v2 VARCHAR2(10);   
  140.     BEGIN   
  141.       OPEN ref_cursor FOR   
  142.         SELECT &col1 col1,&col2 col2 FROM &table WHERE &cond;   
  143.       LOOP   
  144.         FETCH ref_cursor INTO v1,v2;   
  145.         EXIT WHEN ref_cursor%NOTFOUND;   
  146.         dbms_output.put_line('col1='||v1||',col2='||v2);   
  147.       END LOOP;   
  148.       CLOSE ref_cursor;   
  149.     END;   
  150.     /   
  151. 15-11:使用有返回类型的游标变量   
  152.     DECLARE   
  153.       TYPE emp_cursor_type IS REF CURSOR RETURN emp%ROWTYPE;   
  154.       emp_cursor emp_cursor_type;   
  155.       emp_record emp%ROWTYPE;   
  156.     BEGIN   
  157.       OPEN emp_cursor FOR SELECT * FROM emp   
  158.         WHERE deptno=&dno;   
  159.       LOOP   
  160.         FETCH emp_cursor INTO emp_record;   
  161.         EXIT WHEN emp_cursor%NOTFOUND;   
  162.         dbms_output.put_line('姓名:'||emp_record.ename||   
  163.           ',工资:'||emp_record.sal);   
  164.       END LOOP;   
  165.       CLOSE emp_cursor;   
  166.     END;   
  167.     /   
  168. 15-12:使用fetch...bulk collect提取所有数据   
  169.     DECLARE   
  170.       CURSOR emp_cursor IS   
  171.         SELECT * FROM emp WHERE LOWER(job)=LOWER('&job');   
  172.       TYPE emp_table_type IS TABLE OF emp%ROWTYPE;   
  173.       emp_table emp_table_type;   
  174.     BEGIN   
  175.       OPEN emp_cursor;   
  176.       FETCH emp_cursor BULK COLLECT INTO emp_table;   
  177.       CLOSE emp_cursor;   
  178.       FOR i IN 1.. emp_table.COUNT LOOP   
  179.         dbms_output.put_line('姓名:'||emp_table(i).ename   
  180.           ||',工资:'||emp_table(i).sal);   
  181.       END LOOP;   
  182.     END;   
  183.     /   
  184. 15-13:使用limit子句限制提取行数   
  185.     DECLARE   
  186.       CURSOR emp_cursor IS SELECT * FROM emp;   
  187.       TYPE emp_array_type IS VARRAY(5) OF emp%ROWTYPE;   
  188.       emp_array emp_array_type;   
  189.     BEGIN   
  190.       OPEN emp_cursor;   
  191.       LOOP   
  192.         FETCH emp_cursor BULK COLLECT INTO emp_array LIMIT &rows;   
  193.         FOR i IN 1..emp_array.COUNT LOOP   
  194.           dbms_output.put_line('姓名:'||emp_array(i).ename   
  195.             ||',工资:'||emp_array(i).sal);   
  196.         END LOOP;   
  197.         EXIT WHEN emp_cursor%NOTFOUND;   
  198.       END LOOP;   
  199.       CLOSE emp_cursor;   
  200.     END;   
  201.     /   
  202. 15-14:使用cursor表达式   
  203.     DECLARE   
  204.       CURSOR dept_cursor(no NUMBER) IS   
  205.          SELECT a.dname,CURSOR(SELECT * FROM emp   
  206.          WHERE deptno=a.deptno)   
  207.          FROM dept a WHERE a.deptno=no;   
  208.       TYPE ref_cursor_type IS REF CURSOR;   
  209.       emp_cursor ref_cursor_type;   
  210.       emp_record emp%ROWTYPE;   
  211.       v_dname dept.dname%TYPE;   
  212.     BEGIN   
  213.       OPEN dept_cursor(&dno);   
  214.       LOOP   
  215.          FETCH dept_cursor INTO v_dname,emp_cursor;   
  216.          EXIT WHEN dept_cursor%NOTFOUND;   
  217.          dbms_output.put_line('部门名:'||v_dname);   
  218.          LOOP   
  219.            FETCH emp_cursor INTO emp_record;   
  220.            EXIT WHEN emp_cursor%NOTFOUND;   
  221.            dbms_output.put_line('----雇员名:'||emp_record.ename   
  222.             ||',岗位:'||emp_record.job);   
  223.          END LOOP;   
  224.       END LOOP;   
  225.       CLOSE dept_cursor;   
  226.     END;   
  227.     /  
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载