存儲過程中查詢語句如何返回多行結果?
我們知道,如果存儲過程中查詢語句有多行結果輸出,會報錯:ORA-01422: exact fetch returns more than requested number of rows
若想讓存儲過程中的查詢語句返回多行結果不報錯,則需要使用游標來實現。
本例主要也是用來熟悉存儲過程中游標的簡單使用方法。案例所涉及的數據表使用的是oracle自帶的scott用戶。
1.打開輸出選項
SET SERVEROUTPUT ON;
2.創建查詢員工薪水的存儲過程
create or replace procedure proc_salary is
--定義變量
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
--定義游標
CURSOR emp_cursor IS
SELECT empno, ename, sal from emp;
BEGIN
--循環開始
LOOP
IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
FETCH emp_cursor INTO v_empno, v_ename, v_sal;
--退出循環的條件
EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS NULL;
dbms_output.put_line('員工編號為' || v_empno || '的' || v_ename || '薪水為:' || v_sal);
END LOOP;
END;
/
3.執行存儲過程
exec proc_salary;
SQL> exec proc_salary;
員工編號為7369的SMITH薪水為:800
員工編號為7499的ALLEN薪水為:1600
員工編號為7521的WARD薪水為:1250
員工編號為7566的JONES薪水為:2975
員工編號為7654的MARTIN薪水為:1250
員工編號為7698的BLAKE薪水為:2850
員工編號為7782的CLARK薪水為:2450
員工編號為7788的SCOTT薪水為:3000
員工編號為7839的KING薪水為:5000
員工編號為7844的TURNER薪水為:1500
員工編號為7876的ADAMS薪水為:1100
員工編號為7900的JAMES薪水為:950
員工編號為7902的FORD薪水為:3000
員工編號為7934的MILLER薪水為:1300
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00