如下图遇到这样的问题,一般就是使用java代码来解决,但是有了pl/sql完全可以使用它来写这样的逻辑代码,它比任何语言效率都快.
准备环境:jdk,oracle,sqldeveloper4.0版本的,用高版本的打印不出结果 或者使用
PL/SQL Developer 这个软件也可以写plsql 连接数据库的时候使用scott/tiger 这个账号密码连接,这是oracle安装的时候就带的
首先打印一个hello,world
set serveroutput on 是打开默认关闭的oracle的输出开关
plsql语法就是declare 后面写说明部分,比如声明一些变量之类的东西,begin后面写正常的逻辑代码,end;结束语句.
dbms_output相当于java中的类,但在这叫程序包,put_line就相当于java的方法,但在这叫存储过程,或者存储函数.
在plsql里面变量的定义,名字在前面,变量在后面.
var1 char(15); 这个表示声明一个变量为var1 类型是char类型,长度15
married boolean := true; 声明一个变量名为married,boolean类型 := 表示赋值,相当于java的=.plsql中的=相当于java的==,代表比较的意思.
psal number(7,2); 定义变量psal 为number类型 7的长度,2位小数
my_name emp.ename%type; %type表示引用型变量,引用的emp表的ename字段的类型,这个字段是啥类型,声明的变量就是什么类型.
emp_rec emp%rowtype; %rowtype表示把emp表的一行的类型作为emp_rec的类型,一行上面有多个列,可以把这种记录型变量理解为数组.如果要获得一列的值,直接变量名点列名就可以了.
如果声明常量的话在变量名和变量中间加 constant 即可 例如:var1 constant char(15);
下面这个例子就是引用型变量,在plsql中赋值方式有两种,一种是:=一种就是into关键字,into 后面的变量顺序得跟sql语句前面查出来的顺序一样.||是字符串拼接符.
记录型变量,操作跟上面的引用型变量同样的例子
accept代表键盘录入,相当于java的scanner
光标就相当于java的Resultset也就是集合,但是这儿的光标指针初始化是在第一个元素上的,但是java中的resultset是在第一个元素前的.
遍历集合的示例
-- 查询并打印员工的姓名和薪水
/*
光标的属性: %isopen如果打开就是true反之是false %rowcount(影响的行数,就是取出了多少条,取了10条它的值就是10)
%found(还有没有下一条记录) %notfound
*/
declare
--定义光标(游标)
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 没有取到记录;
exit when cemp%notfound;
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
--关闭光标
close cemp;
end;
-- 给员工涨工资,总裁1000 经理800 其他400的示例
-- 给员工涨工资,总裁1000 经理800 其他400
declare
--定义光标
cursor cemp is select empno,job from emp;
pempno emp.empno%type;
pjob emp.job%type;
begin
--打开光标
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;
--提交 ----> why?: 事务 ACID
commit;
dbms_output.put_line('完成');
end;
光标带参数的写法,定义的时候形参开启的时候传入实参
plsql的例外,就相当于java的异常处理,每个then后面相当于个大括号,可以写逻辑代码,在plsql当中最好写上other then,把剩余的可能都写全,不然的话这个异常可能抛到oracle数据库中,可能造成一些问题,在java当中如果你不处理全,还有虚拟机帮你处理,在这里却没有
自定义的例外使用变量的形式定义一个自定义例外,exception,使用的方式跟java中throw往外抛的形式差不多,这儿使用raise关键字进行抛例外.
declare
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;
--进程:pmon进程(proccesss monitor)
close cemp;
exception
when no_emp_found then dbms_output.put_line('没有找到员工');
when others then dbms_output.put_line('其他例外');
end;
在plsql中没有finally,但是抛出例外,光标关闭不了怎么办呢?抛出例外的时候oracle会启动pmon进程来释放资源