把"的薪水是"双引号换成单引号。
/*
1.写一个存储过程
输入:员工编号
输出: 如果这个存在,则输出部门编号,如果部门不存在,则输出0
部门存在,则显示这个部门的所有的员工的信息
SQL语句:
select depno from emp where empno = ??;
判断存在一条记录,或者不存在记录,有两种方式实现
1. 通过系统例外NO_DATA_FOUND实现
2. 通过游标属性%notfound实现
--这里选择通过游标实现
select * from emp;
--集合-->游标-->循环-->退出条件:%notfound
变量:初始值 如何得到
v_depno number :=0;
v_empno number := &empno;
*/
set serveroutput on
accept empno prompt 'Please input empno:';
declare
--定义游标
cursor c_emp(t_empno number) is select depno from emp where empno = t_empno;
v_depno emp.depno%type;
--所有员工信息的游标
cursor c_all_emp is select * from emp;
v_all_emp emp%rowtype;
--定义输入接收的变量
v_empno number := &empno;
begin
--打开光标
open c_emp(v_empno);
--得到部门号
fetch c_emp into v_depno;
if c_emp%notfound then
dbms_output.put_line('0部门存在.');
--输出所有员工信息
--打开所有员工游标
open c_all_emp;
loop
--得到一个员工的信息
fetch c_all_emp into v_all_emp;
exit when c_all_emp%notfound;
--打印一个员工的信息
dbms_output.put_line(v_all.emp.empno||' '||v_all_empno.depno||'...');
end loop;
--关闭所有员工游标
close c_all_emp;
else
dbms_output.put_line('depno is '||v_depno);
end if;
--关闭光标
close c_emp;
end;
/
while cemp%found loop ,如果不fetch的话,永远进入不了循环。
你使用record类型来存储游标中的数据试试
typer record_emp is record
(
var_ename emp.ename%type,
var_sal emp.ename%type
);
aa record_emp
因为%notfound是根据最后一次fetch来判断的,因此当输出最后一条记录后,还会在输出最一条记录,即最后一条记录将输出2遍
最后一次循环将处理在"结果集最后一行"的下一行,该行为NULL,当fetch的时候PL/SQL将不会抛出异常,并且不会覆盖最后一次循环中赋予tempName的值,即tempName会保留最后一次被赋予的值。
fetch是用来提取游标数据的,你这样写,会多一次提取数据的机会
oracle对打开个数是有限定的。一些执行过程中oracle会自动的帮忙销毁,我知道的就这些