PL/SQL 是 Oracle 数据库原生支持的语言,用于在数据库内部编写复杂的业务逻辑。
第一期先学习PL/SQL的一些基本语法:
- 语法
- 变量
- 循环
- 判断体
- 游标
- 异常
一、语法
[declare]
变量声明;
begin
DML/TCL操作;
[exception]
例外处理;
end;
/
declare和exception可以被省略,其他不可省略;
二、变量
- 数值型:NUMBER(n)
- 字符串型:NVARCHAR2(n)
- 表示表中某个字段的类型:%type
- 表示表中所有字段的类型:%rowtype
示例:
1. 输出7369号员工姓名和工资,格式如下:7369号员工的姓名是SMITH,薪水是800,语法:使用表名.字段%type
declare
--定义二个变量,分别装姓名和工资
pename emp.ename%type;
psal emp.sal%type;
begin
--SQL语句
--select ename,sal from emp where empno = 7369;
--PLSQL语句,将ename的值放入pename变量中,sal的值放入psal变量中
select ename,sal into pename,psal from emp where empno = 7369;
--输出
dbms_output.put_line('7369号员工的姓名是'||pename||',薪水是'||psal);
end;
/
- 输出7788号员工姓名和工资,格式如下:7788号员工的姓名是SMITH,薪水是3000,语法:使用表名%rowtype
declare
emp_record emp%rowtype;
begin
select * into emp_record from emp where empno = 7788;
dbms_output.put_line('7788号员工的姓名是'||emp_record.ename||',薪水是'||emp_record.sal);
end;
/
三、循环
- while循环
WHILE total <= 25000
LOOP
total : = total + salary;
END LOOP;
- loop循环(exit后条件成立了才推出循环)
Loop
exit total > 25000;
total := total + salary;
end loop;
- for循环(步长只能为1,不能定义为其他值)
使用for循环显示20-30:
declare
i number(2) := 20;
begin
for i in 20 .. 30
loop
dbms_output.put_line(i);
end loop;
end;
/
四、判断体
IF:
IF 条件
THEN 语句1;
语句2;
END IF;
IF-ELSE:
IF 条件
THEN 语句序列1;
ELSE 语句序列2;
END IF;
IF-ELSE IF-ELSE:
IF 条件一
THEN 语句序列1;
ELSIF 条件二
THEN 语句序列2;
ELSE 语句序列3;
END IF;
五、游标
查询的指针,只在查询时有效
- 有参游标:
使用带参光标cursor,查询10号部门的员工姓名和工资
declare
cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno;
pename emp.ename%type;
psal emp.sal%type;
begin
open cemp(&deptno);
loop
fetch cemp into pename,psal;
exit when cemp%notfound;
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
close cemp;
end;
/
- 无参游标:
使用无参光标cursor,真正给员工涨工资,ANALYST涨1000,MANAGER涨800,其它涨400,要求显示编号,姓名,职位,薪水
declare
cursor cemp is select empno,ename,job,sal from emp;
pempno emp.empno%type;
pename emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
open cemp;
loop
fetch cemp into pempno,pename,pjob,psal;
--循环退出条件一定要写
exit when cemp%notfound;
if pjob='ANALYST' 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;
commit;
close cemp;
end;
/
六、异常
- 捕获异常
DECLARE
[省略]
BEGIN
[省略]
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
no_data_found是预定义的异常,可以直接使用。
- 用户自定义异常
DECLARE
exception_name EXCEPTION;
BEGIN
IF condition THEN
RAISE exception_name;
END IF;
EXCEPTION
WHEN exception_name THEN
statement;
END;
引用资料
[1]www.w3ccoo.com/plsql/plsql…
[2]zhuanlan.zhihu.com/p/34288858