PL/SQL程序比Java程序(JDBC)运行效率高。
变量(引用型变量、记录型变量):
set serveroutput on --打开控制台输出功能
--PL/SQL
declare
--说明部分
begin
--程序
dbms_output.put_line('Hello World');
end;
/
--引用型变量。使用指定表的指定列的类型
declare
--pi constant number:=3.14; --定义常量
--定义变量
--married boolean :=true; -- :=表示赋值, =表示等于
--name varchar2(25);
--salary number(7,2);
pename emp.ename%type; --引用型变量。类型与指定表的指定列保持一致
psal emp.sal%type;
begin
--得到7839的姓名和薪水; 用into关键字表示赋值
select ename,sal into pename,psal from emp where empno=7839;
--打印 ||是字符串连接符
dbms_output.put_line(pename||'的薪水是'||psal);
end;
/ -- /表示执行上条SQL或PL/SQL语句。
--记录型变量:代表一行数据(相当于数组) 查询并打印7839的姓名和薪水
declare
--定义记录型变量:代表一行(相当于数组)
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语句:
-- 判断用户从键盘输入的数字
--接受键盘输入
--变量num是一个地址值,在该地址上保存了输入的值
accept num prompt '请输入一个数字';
declare
--定义变量保存输入的数字
pnum number := # --变量num是一个地址值
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~10
declare
-- 定义变量
pnum number := 1;
begin
loop
--退出条件
exit when pnum > 10;
--打印
dbms_output.put_line(pnum);
--加一
pnum := pnum + 1;
end loop;
end;
/
游标(光标):
游标(光标) (存放多条记录的集合)
-- 查询并打印员工的姓名和薪水
/*
光标的属性: %isopen(是否打开) %rowcount(影响的行数)(光标已经取出的行数,并不是总行数)
%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;
--提交事务
commit; --如果有更新操作,需要提交事务
end;
/
带参数的游标(光标):
-- 查询指定部门的所有员工姓名
declare
--形参
cursor cemp(dno number) is select ename from emp where deptno=dno; --dno是形参
pename emp.ename%type;
begin
--实参
open cemp(20); --20是实参
loop
fetch cemp into pename;
exit when cemp%notfound;
dbms_output.put_line(pename);
end loop;
close cemp;
--提交事务
commit; --如果有更新操作,需要提交事务
end;
/
系统例外(异常):
--例外(异常)
--系统自带的例外,可以直接使用。(no_data_found、too_many_rows、zero_divide、value_error、timeout_on_resource)
-- 被0除
declare
pnum number;
begin
pnum := 1/0;
--捕获异常
exception
--如果是被除0的异常
when zero_divide then dbms_output.put_line('1:0不能做分母');
dbms_output.put_line('2:0不能做分母'); --then中可以有多行。
--如果是算术或转换异常
when value_error then dbms_output.put_line('算术或者转换错误');
when others then dbms_output.put_line('其他例外'); --others表示其他所有例外(异常)。 PL/SQL中最好捕获所有的异常。
end;
/
自定义例外(异常):
-- 查询50号部门的员工
declare
cursor cemp is select ename from emp where deptno=50;
pename emp.ename%type;
--自定义例外
no_emp_found exception; --exception类型 (自定义例外)
begin
open cemp; --打开游标
--取第一条记录
fetch cemp into pename;
if cemp%notfound then
--抛出例外
raise no_emp_found; --raise表示抛出异常
end if;
--进程:pmon进程(process monitor)用于释放失败进程的资源。
close cemp; --关闭游标。由pmon进程释放
--捕获异常
exception
when no_emp_found then dbms_output.put_line('没有找到员工');
when others then dbms_output.put_line('其他例外');
end;
/