6. v_dname varchar2(15);
7. v_manager varchar2(15); 8. CURSOR list_cursor IS
9. SELECT deptno,count(*),sum(sal) FROM emp group by deptno; 10. BEGIN
11. OPEN list_cursor;
12. DBMS_OUTPUT.PUT_LINE('----------- ²¿ Êͳ ¼Æ ±í -----------'); 13. DBMS_OUTPUT.PUT_LINE('²¿ÃÅÃû³Æ ×ÜÈËÊý ×ܹ¤×Ê ²¿ÃžÀí'); 14. FETCH list_cursor INTO v_deptno,v_count,v_sumsal; 15. WHILE list_cursor%found LOOP 16. SELECT dname INTO v_dname FROM dept 17. WHERE deptno=v_deptno;
18. SELECT ename INTO v_manager FROM emp 19. WHERE deptno=v_deptno and job='MANAGER';
20. DBMS_OUTPUT.PUT_LINE(rpad(v_dname,13)||rpad(to_char(v_count),8) 21. ||rpad(to_char(v_sumsal),9)||v_manager);
22. FETCH list_cursor INTO v_deptno,v_count,v_sumsal; 23. END LOOP;
24. DBMS_OUTPUT.PUT_LINE('--------------------------------------');
25. CLOSE list_cursor; 26. END;
Êä³ö½á¹ûΪ£º Sql´úÂë
1. -------------------- ²¿ Êͳ ¼Æ ±í ----------------- 2. ²¿ÃÅÃû³Æ ×ÜÈËÊý ×ܹ¤×Ê ²¿ÃžÀí 3. ACCOUNTING 3 8750 CLARK 4. 5. 6. 7.
RESEARCH 5 10875 JONES
SALES 6 9400 BLAKE
------------------------------------------------------------- PL/SQL ¹ý³ÌÒѳɹ¦Íê³É¡£
˵Ã÷£ºÓαêÖÐʹÓõ½ÁËÆð·Ö×鹦ÄܵÄSELECTÓï¾ä£¬Í³¼Æ³ö¸÷²¿ÃŵÄ×ÜÈËÊýºÍ×ܹ¤×Ê¡£ÔÙ¸ù¾Ý²¿ÃűàºÅºÍÖ°ÎñÕÒµ½²¿ÃŵľÀí¡£¸Ã³ÌÐò¼Ù¶¨Ã¿¸ö²¿ÃÅÓÐÒ»¸ö¾Àí¡£
¡¾ÑµÁ·5¡¿ Ϊ¹ÍÔ±Ôö¼Ó¹¤×Ê£¬´Ó¹¤×ʵ͵ĹÍÔ±¿ªÊ¼£¬ÎªÃ¿¸öÈËÔö¼ÓÔ¹¤×ʵÄ10%£¬ÏÞ¶¨ËùÔö¼ÓµÄ¹¤×Ê×ܶîΪ800Ôª£¬ÏÔʾÔö¼Ó¹¤×ʵÄÈËÊýºÍÓà¶î¡£ ÊäÈë²¢µ÷ÊÔÒÔϳÌÐò£º Sql´úÂë
1. SET SERVEROUTPUT ON 2. DECLARE
3. V_NAME CHAR(10); 4. 5. 6. 7.
V_EMPNO NUMBER(5); V_SAL NUMBER(8); V_SAL1 NUMBER(8);
V_TOTAL NUMBER(8) := 800; --Ôö¼Ó¹¤×ʵÄ×ܶî
8. V_NUM NUMBER(5):=0; --Ôö¼Ó¹¤×ʵÄÈËÊý 9. CURSOR emp_cursor IS
10. SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL ASC; 11. BEGIN
12. OPEN emp_cursor;
13. DBMS_OUTPUT.PUT_LINE('ÐÕÃû Ô¹¤×Ê Ð¹¤×Ê'); 14. DBMS_OUTPUT.PUT_LINE('---------------------------'); 15. LOOP
16. FETCH emp_cursor INTO V_EMPNO,V_NAME,V_SAL; 17. EXIT WHEN emp_cursor%NOTFOUND; 18. V_SAL1:= V_SAL*0.1;
19. IF V_TOTAL>V_SAL1 THEN
20. V_TOTAL := V_TOTAL - V_SAL1; 21. V_NUM:=V_NUM+1;
22. DBMS_OUTPUT.PUT_LINE(V_NAME||TO_CHAR(V_SAL,'99999')|| 23. TO_CHAR(V_SAL+V_SAL1,'99999'));
24. UPDATE EMP SET SAL=SAL+V_SAL1 25. WHERE EMPNO=V_EMPNO; 26. ELSE
27. DBMS_OUTPUT.PUT_LINE(V_NAME||TO_CHAR(V_SAL,'99999')||TO_CHAR(V_SAL,'99999'));
28. END IF;
29. END LOOP;
30. DBMS_OUTPUT.PUT_LINE('---------------------------'); 31. DBMS_OUTPUT.PUT_LINE('Ôö¼Ó¹¤×ÊÈËÊý:'||V_NUM||' Ê£Ó๤×Ê£º'||V_TOTAL);
32. CLOSE emp_cursor; 33. COMMIT; 34. END;
Êä³ö½á¹ûΪ£º Sql´úÂë
1. ÐÕÃû Ô¹¤×Ê Ð¹¤×Ê
2. --------------------------------------------- 3. SMITH 1289 1418 4. JAMES 1531 1684 5. MARTIN 1664 1830
6. MILLER 1730 1903
7. ALLEN 1760 1936 8. ADAMS 1771 1771 9. TURNER 1815 1815 10. WARD 1830 1830 11. BLAKE 2850 2850 12. CLARK 2850 2850
13. JONES 2975 2975 14. FORD 3000 3000 15. KING 5000 5000
16. ----------------------------------------------- 17. Ôö¼Ó¹¤×ÊÈËÊý£º5 Ê£Ó๤×Ê£º3 18. PL/SQL ¹ý³ÌÒѳɹ¦Íê³É¡£
¡¾Á·Ï°1¡¿°´²¿ÃűàºÅ´ÓСµ½´óµÄ˳ÐòÊä³ö¹ÍÔ±Ãû×Ö¡¢¹¤×ÊÒÔ¼°¹¤×ÊÓëÆ½¾ù¹¤×ʵIJ ¡¾Á·Ï°2¡¿ÎªËùÓйÍÔ±Ôö¼Ó¹¤×Ê£¬¹¤×ÊÔÚ1000ÒÔÄÚµÄÔö¼Ó30%£¬¹¤×ÊÔÚ1000¡«2000Ö®¼äµÄÔö¼Ó20%£¬2000ÒÔÉϵÄÔö¼Ó10%¡£
======================================================
oracle¶¯Ì¬ÓαêʵÀý
1£¬´ø²ÎÊýµÄÓαê
Óë´æ´¢¹ý³ÌºÍº¯ÊýÏàËÆ£¬¿ÉÒÔ½«²ÎÊý´«µÝ¸øÓα겢ÔÚ²éѯÖÐʹÓá£Õâ¶ÔÓÚ´¦ÀíÔÚijÖÖÌõ¼þÏ´ò¿ªÓαêµÄÇé¿ö·Ç³£ÓÐÓá£ËüµÄÓï·¨ÈçÏ£º
CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement; ¶¨Òå²ÎÊýµÄÓï·¨ÈçÏ£º
Parameter_name [IN] data_type[{:=|DEFAULT} value]
Óë´æ´¢¹ý³Ì²»Í¬µÄÊÇ£¬ÓαêÖ»ÄܽÓÊÜ´«µÝµÄÖµ£¬¶ø²»ÄÜ·µ»ØÖµ¡£²ÎÊýÖ»¶¨ÒåÊý¾ÝÀàÐÍ£¬Ã»ÓдóС¡£
ÁíÍâ¿ÉÒÔ¸ø²ÎÊýÉ趨һ¸öȱʡֵ£¬µ±Ã»ÓвÎÊýÖµ´«µÝ¸øÓαêʱ£¬¾ÍʹÓÃȱʡֵ¡£ÓαêÖж¨ÒåµÄ²ÎÊýÖ»ÊÇÒ»¸öռλ·û£¬ÔÚ±ð´¦ÒýÓøòÎÊý²»Ò»¶¨¿É¿¿¡£ ÔÚ´ò¿ªÓαêʱ¸ø²ÎÊý¸³Öµ£¬Óï·¨ÈçÏ£º
OPEN cursor_name[value[,value]....]; ²ÎÊýÖµ¿ÉÒÔÊÇÎÄ×Ö»ò±äÁ¿¡£ Àý£º DECALRE
CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno; CURSOR c_emp (p_dept VARACHAR2) IS SELECT ename,salary FROM emp
WHERE deptno=p_dept ORDER BY ename
r_dept DEPT%ROWTYPE; v_ename EMP.ENAME%TYPE; v_salary EMP.SALARY%TYPE; v_tot_salary EMP.SALARY%TYPE; BEGIN
OPEN c_dept; LOOP
FETCH c_dept INTO r_dept;
EXIT WHEN c_dept%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname); v_tot_salary:=0;
OPEN c_emp(r_dept.deptno);
LOOP
FETCH c_emp INTO v_ename,v_salary; EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary); v_tot_salary:=v_tot_salary+v_salary;
END LOOP; CLOSE c_emp;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary); END LOOP; CLOSE c_dept; END;
2. ×Ö·û´®±äÁ¿
¶¯Ì¬Óαê¾ÍÊǶ¯Ì¬¶¨ÒåÓαꡣ declare
type t_sor is ref cursor;
v_sor t_sor; --±ØÐèµÄ£¬Í¨¹ý¶ÔÏó±äÁ¿ÊµÏÖ. ... begin .. end; /
¸øÒ»¸öÍêÕûµÄÀý×Ó:
create or replace procedure SP_CLEAR(V_TABLE IN STRING) IS