set serveroutput on --使用基本变量类型 declare --定义基本变量;类型 --基本数据类型 pnumber number(7, 2); pname varchar2(20); pdate date; begin pnumber := 1; dbms_output.put_line(pnumber); dbms_output.put_line(‘hello‘); pname :=‘tom‘; dbms_output.put_line(pname); pdate := sysdate; dbms_output.put_line(pdate); --明天的日期 dbms_output.put_line(pdate + 1); end; / --引用型变量 set serveroutput on declare --定义引用型变量,查询并打印7839的姓名和薪水 --pname varchar2(20); --psal number(7,2); pname EMP_bch.Ename%type; psal EMP_bch.Sal%type; begin --得到7839的姓名和薪水 select ename,sal into pname,psal from EMP_bch where empno=7839; --打印姓名和薪水 dbms_output.put_line(pname||‘的薪水是‘||psal); end; / --记录型变量,查询并打印7839的姓名和薪水 set serveroutput on declare --定义记录型变量:注意代表一行 EMP_bch_rec EMP_bch%rowtype; begin --得到7839的一行信息 select * into EMP_bch_rec from EMP_bch where empno=7839; --打印姓名和薪水 dbms_output.put_line(EMP_bch_rec.ename||‘的薪水是‘||EMP_bch_rec.sal); end; / --IF语句练习 /* *判断用户从键盘输入的数字 1.如何使用IF语句 2.如何接受几个键盘输入(字符串) */ set serveroutput on --接受键盘输入 --num是一个地址值:在该地址上保存了输入的值 accept num prompt‘请输入一个数字‘; declare --定义变量保存用户从键盘输入的数字 pnum number:=# begin --执行IF语句进行条件判断 if pnum =0 then dbms_output.put_line(‘您输入数字是0‘); elsif pnum = 1 then dbms_output.put_line(‘您输入的是1‘); elsif pnum = 2 then dbms_output.put_line(‘您输入的是2‘); else dbms_output.put_line(‘您输入的是其他数字‘); end if; end; / --使用while循环 循环打印1——10 --打开输出 set serveroutput on declare --定义循环变量 pnum number:=1; begin while pnum<=10 loop --循环体 dbms_output.put_line(pnum); --使变量自增 pnum := pnum + 1; end loop; end; / --推荐使用!!! --使用loop循环打印1——10 set serveroutput on declare --定义循环变量,并赋初始值为1 pnum number:=1; begin loop --退出条件,循环变量大于10 exit when pnum >10; --打印该变量的值 dbms_output.put_line(pnum); --变量自增一 pnum := pnum +1; end loop; end; / --使用循环FOR循环打印1——10 set serveroutput on declare --定义循环变量并赋初值为1 pnum number:=1; begin for pnum in 1..10 loop dbms_output.put_line(pnum); end loop; end; / --游标的练习 set serveroutput on declare --定义一个游标 --游标属性 %found 取到值为true,取不到为false,%notfound相反 cursor cemp is select ename,sal from EMP_bch; pname EMP_bch.ename%type; psal EMP_bch.sal%type; begin --打开游标 open cemp; loop --取一条记录 fetch cemp into pname,psal; --1.循环什么时候退出? --fetch 不一定能取到记录 exit when cemp%notfound; --打印结果 dbms_output.put_line(pname||‘的薪水是‘||psal); end loop; --关闭游标 close cemp; end; / --给员工涨工资 总裁:1000,经理:800,其他:400 set serveroutput on declare --定义游标给哪些员工涨工资 cursor cemp is select empno,job from EMP_bch; pempno EMP_bch.Empno%type; pjob EMP_bch.Job%type; begin rollback; --打开游标 open cemp; if cemp%isopen then dbms_output.put_line(‘游标已经打开‘); else dbms_output.put_line(‘游标没有打开‘); loop fetch cemp into pempno,pjob; exit when cemp%notfound; --判断员工的职位 if pjob =‘PRESIDENT‘ then update EMP_bch set sal = sal+1000 where empno=pempno; elsif pjob =‘MANAGER‘ then update EMP_bch set sal = sal+800 where empno=pempno; else update EMP_bch set sal = sal+400 where empno=pempno; end if; end loop; --关闭游标 close cemp; --对于oracle,默认的事物隔离级别是read committed commit; dbms_output.put_line(‘涨工资完成‘); end; / /* 游标的属性 %found %motfound %isopen:判断游标是否打开 %rowcount:影响的行数 有标的限制:默认情况下只允许在同一个会话中打开300个游标 */ set serveroutput on declare --定义游标 cursor cemp is select empno,job from Emp_Bch; pempno Emp_Bch.Empno%type; pjob Emp_Bch.Job%type; begin loop open cemp; --取出一条记录 fetch cemp into pempno,pjob; cemp%notfound; exit when cemp%notfound; --if pjob=‘PRESIDENT‘ then dbms_output.put_line(‘rowcount‘||cemp%rowcount); --end if; close cemp; end loop; end; / --带参数的游标 set serveroutput on declare --带参数的游标 cursor cemp(dno number) is select ename from EMP_BCH where deptno = dno; pename EMP_BCH.ENAME%TYPE; begin --打开游标 open cemp(10); loop fetch cemp into pename; exit when cemp%notfound; dbms_output.put_line(pename); end loop; close cemp; end; / --系统异常:no_data_found set serveroutput on declare pename EMP_BCH.ENAME%TYPE; begin SELECT ENAME into pename FROM EMP_BCH WHERE EMPNO=1234; exception when no_data_found then dbms_output.put_line(‘没有找到员工‘); when others then dbms_output.put_line(‘其他异常‘); end; / --系统异常 too_many_rows set serveroutput on declare pename EMP_bch.ename%type; begin --查询所有员工的姓名 select ename INTO pename from EMP_BCH WHERE DEPTNO=10; exception when too_many_rows then dbms_output.put_line(‘select into 匹配了多行‘); when others then dbms_output.put_line(‘其他异常‘); end; / --系统异常 zero_devide set serveroutput on declare --定义一个基本变量 pnum number; begin pnum:=1/0; exception when zero_divide then dbms_output.put_line(‘1;0不能做被除数‘); dbms_output.put_line(‘1;0不能做被除数‘); when others then dbms_output.put_line(‘其他例外‘); end; / --系统异常 value_error set serveroutput on declare --定义一个number类型的变量 pnum number; begin pnum:=‘abc‘; exception when value_error then dbms_output.put_line(‘算数或转换错误‘); when others then dbms_output.put_line(‘其他错误‘); end; / --自定义异常:查询50号部门的员工 set serveroutput on declare cursor cemp is select ename from EMP_BCH where DEPTNO=50; pename EMP_BCH.ENAME%TYPE; --自定义异常 no_emp_found exception; begin OPEN CEMP; --取到一个用户 FETCH cemp into pename; if cemp%notfound then raise no_emp_found; end if; CLOSE CEMP; exception when no_emp_found then dbms_output.put_line(‘没有找到员工‘); when others then dbms_output.put_line(‘其他例外‘); end; / /* loop exit when cemp%notfound; end loop; */ --瀑布模型 /* sql语句 SELECT TO_CHAR(HITEDATE,‘yyyy‘) from EMP_bch; -->游标-->循环-->退出条件:notfound 变量:1.初始值 2.如何得到 每年入职的员工数 count80 number:=0; count81 number:=0; count82 number:=0; count87 number:=0; */ set serveroutput on declare --定义游标 cursor cemp is select to_char(hiredate,‘yyyy‘) from EMP_bch; phiredate varchar2(4); --入职人数 count80 number:=0; count81 number:=0; count82 number:=0; count87 number:=0; begin open cemp; loop fetch cemp into phiredate; exit when cemp%notfound; --判断入职年份 if phiredate=‘1980‘ then count80:=count80+1; elsif phiredate=‘1981‘ then count81:=count81+1; elsif phiredate=‘1982‘ then count82:=count82+1; else count87:=count87+1; end if; end loop; close cemp; --输出结果 dbms_output.put_line(‘Total:‘||(count80+count81+count82+count87)); dbms_output.put_line(‘1980:‘||count80); dbms_output.put_line(‘1981:‘||count81); dbms_output.put_line(‘1982:‘||count82); dbms_output.put_line(‘1987:‘||count87); end; /
时间: 2024-10-06 21:14:43