set serveroutput on;exec sp_get_student;代码没什么问题,不过 IF cur_student%FOUND 这个判断有点多余,因为上面已经有 exit 的判断,找不到记录就会跳出的
代码没错,而且层次也还挺清晰的,也挺规范,但后面要是在定义exception就会更好. 我拿你代码测试多是可以通过的,或许是你student表没数据噢.仔细检查一下.. 下面是我更改过后的代码你对比一下,基本没什么变动,但我执行是可以有结果的. CREATE OR REPLACE PROCEDURE sp_get_ename IS CURSOR cur_emp IS SELECT ename, empno FROM emp; c_name emp.ename%TYPE; c_eno emp.empno%TYPE;BEGIN OPEN cur_emp; LOOP FETCH cur_emp INTO c_name, c_eno;
EXIT WHEN cur_emp%NOTFOUND;
IF cur_emp%FOUND THEN DBMS_OUTPUT.put_line(c_name || '-->' || c_eno); END IF; END LOOP; CLOSE cur_emp; exception when others then dbms_output.put_line(sqlcode||sqlerrm); END;begin sp_get_ename ; end;
代码没错,而且层次也还挺清晰的,也挺规范,但后面要是在定义exception就会更好. 我拿你代码测试多是可以通过的,或许是你student表没数据噢.仔细检查一下.. 下面是我更改过后的代码你对比一下,基本没什么变动,但我执行是可以有结果的. CREATE OR REPLACE PROCEDURE sp_get_ename IS CURSOR cur_emp IS SELECT ename, empno FROM emp; c_name emp.ename%TYPE; c_eno emp.empno%TYPE;BEGIN OPEN cur_emp; LOOP FETCH cur_emp INTO c_name, c_eno;
EXIT WHEN cur_emp%NOTFOUND;
IF cur_emp%FOUND THEN DBMS_OUTPUT.put_line(c_name || '-->' || c_eno); END IF; END LOOP; CLOSE cur_emp; exception when others then dbms_output.put_line(sqlcode||sqlerrm); END;begin sp_get_ename ; end;
CREATE OR REPLACE PROCEDURE sp_get_student AS CURSOR cur_student IS SELECT no, name FROM student; c_no student.no%TYPE; c_name student.name%TYPE; BEGIN OPEN cur_student; LOOP FETCH cur_student INTO c_no, c_name; EXIT WHEN cur_student%NOTFOUND; IF cur_student%FOUND THEN DBMS_OUTPUT.PUT_LINE (c_no || '-->' || c_name); END IF; END LOOP; END; /自己又敲了一遍,可就是没有数据,直接执行SELECT * FROM student;可以查到数据的,比较郁闷
end loop; 后面拉了句close cur_student;哪里的问题,郁闷了
是在Toad for Oracle 10中编码测试的,不晓得,是不是,哪里的服务没开,还是有什么关系
LOOP FETCH cur_student INTO c_name, c_no; EXIT WHEN cur_student%NOTFOUND;
DBMS_OUTPUT.put_line (cur_student.c_name || '-->' || cur_student.c_no); END LOOP; CLOSE cur_student; END;这样修改试一下!!
是在PLSQL中?工具中这个输出是在输出的那个窗口,而不是SELECT出来的那个窗口 如果是DOS窗口下,需要打开开关 代码也可以简化成如下(游标可以定义,替代FOR后面括号里的内容): CREATE OR REPLACE PROCEDURE sp_get_student AS BEGIN for vc in (SELECT no, name FROM student) LOOP DBMS_OUTPUT.PUT_LINE (vc.no || '-->' || vc.name); END LOOP; END;
如果你是在pl/sql或dom中执行的话, 把 set serveroutput on设定一下,就可以看到输出台了
我拿你代码测试多是可以通过的,或许是你student表没数据噢.仔细检查一下..
下面是我更改过后的代码你对比一下,基本没什么变动,但我执行是可以有结果的.
CREATE OR REPLACE PROCEDURE sp_get_ename IS
CURSOR cur_emp IS
SELECT ename, empno FROM emp; c_name emp.ename%TYPE;
c_eno emp.empno%TYPE;BEGIN
OPEN cur_emp; LOOP
FETCH cur_emp
INTO c_name, c_eno;
EXIT WHEN cur_emp%NOTFOUND;
IF cur_emp%FOUND
THEN DBMS_OUTPUT.put_line(c_name || '-->' || c_eno);
END IF;
END LOOP;
CLOSE cur_emp;
exception
when others then
dbms_output.put_line(sqlcode||sqlerrm);
END;begin
sp_get_ename ;
end;
我拿你代码测试多是可以通过的,或许是你student表没数据噢.仔细检查一下..
下面是我更改过后的代码你对比一下,基本没什么变动,但我执行是可以有结果的.
CREATE OR REPLACE PROCEDURE sp_get_ename IS
CURSOR cur_emp IS
SELECT ename, empno FROM emp; c_name emp.ename%TYPE;
c_eno emp.empno%TYPE;BEGIN
OPEN cur_emp; LOOP
FETCH cur_emp
INTO c_name, c_eno;
EXIT WHEN cur_emp%NOTFOUND;
IF cur_emp%FOUND
THEN DBMS_OUTPUT.put_line(c_name || '-->' || c_eno);
END IF;
END LOOP;
CLOSE cur_emp;
exception
when others then
dbms_output.put_line(sqlcode||sqlerrm);
END;begin
sp_get_ename ;
end;
sp_get_ename ;
end;去output界面里找
AS
CURSOR cur_student
IS
SELECT no, name FROM student; c_no student.no%TYPE;
c_name student.name%TYPE;
BEGIN
OPEN cur_student; LOOP
FETCH cur_student
INTO c_no, c_name; EXIT WHEN cur_student%NOTFOUND; IF cur_student%FOUND
THEN
DBMS_OUTPUT.PUT_LINE (c_no || '-->' || c_name);
END IF;
END LOOP;
END;
/自己又敲了一遍,可就是没有数据,直接执行SELECT * FROM student;可以查到数据的,比较郁闷
后面拉了句close cur_student;哪里的问题,郁闷了
FETCH cur_student
INTO c_name, c_no; EXIT WHEN cur_student%NOTFOUND;
DBMS_OUTPUT.put_line (cur_student.c_name || '-->' || cur_student.c_no);
END LOOP; CLOSE cur_student;
END;这样修改试一下!!
如果是DOS窗口下,需要打开开关
代码也可以简化成如下(游标可以定义,替代FOR后面括号里的内容):
CREATE OR REPLACE PROCEDURE sp_get_student
AS
BEGIN
for vc in (SELECT no, name FROM student) LOOP
DBMS_OUTPUT.PUT_LINE (vc.no || '-->' || vc.name);
END LOOP;
END;
把 set serveroutput on设定一下,就可以看到输出台了