set serveroutput on; VAR g_n NUMBER; PROMPT 'Please enter empno:'; ACCEPT p_empno NUMBER FORMAT '9999' DEFAULT '260'; DECLARE v_empno NUMBER:=&p_empno; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; BEGIN SELECT e.ename,e.sal,s.grade INTO v_ename,v_sal,:g_n FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal AND e.empno=v_empno; DBMS_OUTPUT.PUT_LINE(v_ename); DBMS_OUTPUT.PUT_LINE(v_sal); END; /报错:实际返回的行数超出请求的行数使用游标怎么改呢?
时间: 2024-02-19 10:59:18 浏览: 24
可以将这段代码改写为使用游标来处理SQL语句的结果。具体代码如下:
```
SET SERVEROUTPUT ON;
VAR g_n NUMBER;
PROMPT 'Please enter empno:';
ACCEPT p_empno NUMBER FORMAT '9999' DEFAULT '260';
DECLARE
v_empno NUMBER := &p_empno;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
CURSOR c_emp IS
SELECT e.ename, e.sal
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal
AND e.empno = v_empno;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_ename, v_sal;
WHILE c_emp%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_ename || ', ' || v_sal);
FETCH c_emp INTO v_ename, v_sal;
END LOOP;
CLOSE c_emp;
END;
/
```
这个代码使用了一个名为 c_emp 的游标,通过游标来处理SQL语句的结果。首先打开游标,然后循环获取每一行结果,直到游标的结果集为空为止。在每一次循环中,将获取到的 ename 和 sal 输出到屏幕上。最后关闭游标。