Oracle-PL/SQL
来源:互联网 发布:视频转换mp3软件 编辑:程序博客网 时间:2024/05/05 07:28
HelloWorld
SQL> declare 2 -- 变量的说明 3 begin 4 --程序体 5 --程序包 package 6 dbms_output.put_line('Hello World'); 7 end; 8 /PL/SQL 过程已成功完成。SQL> --打开输出开关SQL> set serveroutput onSQL> /Hello World PL/SQL 过程已成功完成。
Procudure Language/SQL 面向过程得到语言
--引用型变量: 查询并打印7839的姓名和薪水set serveroutput ondeclare --定义变量 pename emp.ename%type; psal emp.sal%type;begin --查询 select ename,sal into pename,psal from emp where empno=7839; --打印 dbms_output.put_line(pename||'的薪水是'||psal);end;/
--记录型变量 查询并打印7839的姓名和薪水--代表了表中的一行数据set serveroutput ondeclare --定义变量 emp_rec emp%rowtype;begin --得到一行 select * into emp_rec from emp where empno=7839; dbms_output.put_line(emp_rec.ename||'的薪水是'||emp_rec.sal);end;/
--if语句:判断用户输入的数字set serveroutput on/*1.提示信息2. 接收键盘输入num 是一个地址值SQL优化: num绑定变量(尽量使用绑定变量)select * from emp where deptno=10; --> 执行计划select * from emp where deptno=20; --> 执行计划-->select * from emp where deptno=#*/accept num prompt '请输入一个数字';declare --变量保存输入的数字 pnum number := #begin --判断 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;/
--循环: 打印1~10set serveroutput ondeclare pnum number := 1;begin loop --退出 成立退出 不成立循环 exit when pnum > 10; --隐式转换 dbms_output.put_line(pnum); pnum := pnum + 1; end loop;end;/
光标
--光标: 使用游标查询员工姓名和工资,并打印/*光标的属性:%isopen 是否被打开%rowcount 行数%notfound 是否有值*/set serveroutput ondeclare --光标 cursor cemp is select ename,sal from emp; pename emp.ename%type; psal emp.sal%type;begin open cemp; loop --从集合中取值 fetch cemp into pename,psal; --**** exit when cemp%notfound; dbms_output.put_line(pename||'的薪水是'||psal); end loop; close cemp;end;/
--给员工涨工资 总裁1000 经理800 其他400set serveroutput on/*SQL> show parameters cursorNAME TYPE VALUE------------------------------------ ----------- --------cursor_sharing string EXACTcursor_space_for_time boolean FALSEopen_cursors integer 300session_cached_cursors integer 20*/declare --光标代表员工 cursor cemp is select empno,empjob from emp; pempno emp.empno%type; pjob emp.empjob%type;begin rollback; open cemp; loop fetch cemp into pempno,pjob; exit when cemp%notfound; --判断 if pjob = 'PRESIDENT' then update emp set sal=sal+1000 where empno=pempno; elsif pjob = 'MANAGER' then update emp set sal=sal+800 where empno=pempno; else update emp set sal=sal+400 where empno=pempno; end if; end loop; close cemp; --提交: 隔离级别 commit; dbms_output.put_line('完成');end;/
--带参数的光标:查询某个部门的员工姓名 set serveroutput ondeclare cursor cemp(pdno number) is select ename from emp where deptno=pdno; pename emp.ename%type;begin open cemp(20); loop fetch cemp into pename; exit when cemp%notfound; dbms_output.put_line(pename); end loop; close cemp;end;/
异常
补充一下 java采用的是父类异常处理机制 子类处理不了 抛给父类
/*Zero_Divide ( 被零除)*/set serveroutput ondeclare pnum number;begin pnum := 1/0;exception when Zero_Divide then dbms_output.put_line('1: 0不能做被除数'); dbms_output.put_line('2: 0不能做被除数'); when Value_error then dbms_output.put_line('算术错'); when others then dbms_output.put_line('其他例外');end;/
自定义例外
--自定义例外: 查询50号部门的员工姓名set serveroutput ondeclare cursor cemp is select ename from emp where deptno=50; pename emp.ename%type; --自定义例外 no_emp_found exception;begin open cemp; --取一个员工 fetch cemp into pename; if cemp%notfound then raise no_emp_found; end if;/* if cemp%isopen then close 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;/
练习
/*实例1:统计每年入职的员工个数。可能SQL:select to_char(hiredate,'yyyy') from emp;*/set serveroutput ondeclare cursor cemp is select to_char(hiredate,'yyyy') from emp; 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;/
/*为员工长工资。从最低工资调起每人长10%,但工资总额不能超过5万元,请计算长工资的人数和长工资后的工资总额,并输出输出长工资人数及工资总额。可能的SQL:员工: select empno,sal from emp order by sal;长工资后的工资总额:1. 对sal进行累加: 新的工资总额=旧的工资 + sal*0.1; 2. sum(sal): 查询数据库练习: 工资不能超过5w*/set serveroutput ondeclare --员工 cursor cemp is select empno,sal from emp order by sal; pempno emp.empno%type; psal emp.sal%type; --长工资的人数 countEmp number := 0; --工资总额 salTotal number;begin --涨前工资总额 select sum(sal) into salTotal from emp; open cemp; loop --工资总额>5w exit when salTotal > 50000; --取一个员工 fetch cemp into pempno,psal; exit when cemp%notfound; --涨工资 update emp set sal=sal*1.1 where empno=pempno; --人数 countEmp := countEmp +1; --工资总额 salTotal := salTotal + psal * 0.1; end loop; close cemp; commit; --输出 dbms_output.put_line('长工资的人数:'|| countEmp); dbms_output.put_line('工资总额:'|| salTotal);end;/
/*用PL/SQL语言编写一程序,实现按部门分段(6000以上、(6000,3000)、3000元以下)统计各工资段的职工人数、以及各部门的工资总额(工资总额中不包括奖金)SQL语句:部门: select deptno from dept;员工的工资: select sal from emp where deptno=???工资总额: select sum(sal) from emp where deptno=??? */set serveroutput ondeclare --部门 cursor cdept is select deptno from dept; pdno dept.deptno%type; --部门中的员工 cursor cemp(dno number) is select sal from emp where deptno=dno; psal emp.sal%type; --各个段的人数 count1 number;count2 number;count3 number; --部门的工资总额 salTotal number;begin open cdept; loop --取部门 fetch cdept into pdno; exit when cdept%notfound; --初始化 count1 :=0;count2:=0;count3:=0; select sum(sal) into salTotal from emp where deptno=pdno; --取部门中的员工 open cemp(pdno); loop fetch cemp into psal; exit when cemp%notfound; --判断 if psal<3000 then count1:=count1+1; elsif psal>=3000 and psal<6000 then count2:=count2+1; else count3:=count3+1; end if; end loop; close cemp; --保存当前部门 insert into msg1 values(pdno,count1,count2,count3,nvl(salTotal,0)); end loop; close cdept; commit; dbms_output.put_line('完成');end;/
0 0
- ORACLE PL/SQL 基础
- Oracle PL/SQL入门
- oracle pl/sql
- Learning Oracle PL/SQL
- ORACLE的PL/SQL
- ORACLE PL/SQL 基础
- Oracle PL/SQL入门
- ORACLE PL/SQL入门
- Oracle PL/SQL入门
- oracle PL/SQL学习
- Oracle PL/SQL Programming
- Oracle-PL/SQL
- Oracle PL/SQL游标
- Oracle PL/SQL学习
- oracle pl/sql实例
- Oracle PL/SQL编程
- oracle pl/sql 编程
- Oracle PL/SQL
- InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
- 类簇在iOS 开发中的应用
- 【转载】SQL Server数据库备份的两种方式
- 了解Android的view,viewgroup和layout
- DLL的进入退出——由DLL_PROCESS_ATTACH而联系搜索起来
- Oracle-PL/SQL
- 86 EditText 从左上角开始编辑
- sparse-autoencoder
- yuv2rgb 优化
- [LeetCode]135.Candy
- 高效编辑器vim之自动补全
- 李洋老师将继续介绍Android系统架构的介绍——《Android系统启动过程剖析》
- Windows下编译SDL
- Spring Annotation