pl/sql基础语法
-
PL/SQL :是SQL语言的拓展,过程化SQL语言
-
PL(Procedural Language):过程语言
-
SQL:结构化查询语言
-
分为三个部分:声明部分、可执行部分、异常处理部分
declare
声明部分:声明变量、常量、类型、游标
begin
执行部分:存储过程以及SQL语句 (逻辑代码)
exception (可选)
异常部分:处理异常
end;
直接定义变量
declare
abc_name varchar2(10);
abc_empno number(10);
t_emp emp%rowtype;
begin
/* 将emp表中特定的ename和empno赋给t_emp中对应属性 */
select ename,empno into t_emp.ename,t_emp.empno from emp
where empno=&empno;
/* 打印必背 */
dbms_output.put_line('你好'||t_emp.ename||t_emp.empno);
end;
调用表中字段定义变量
declare
abc_name emp.ename%type;
abc_empno number(10);
t_emp emp%rowtype;
begin
select ename, empno into t_emp.ename ,t_emp.empno from emp where empno = &empno;
dbms_output.put_line('你好'||t_emp.ename||t_emp.empno);
/* dbms_output.put_line(abc_empno);*/
--exception 异常
/* when no_data_found then
操作 */
end;
声明参数的方法
- 方法1
declare
v_ename VARCHAR2(10);
v_comm NUMBER(7, 2);
v_empno number(10);
- 方法2
declare
v_ename emp.ename%type;
v_sal emp.sal%type;
- 方法3
declare
v_emp emp%rowtype;
- 方法4
declare
type v_canshu is record( v_sal NUMBER(7, 2), v_ename emp.ename%type, v_emp emp%rowtype);
v_canshuji v_canshu;
判断
请使用复制的emp表,不要直接修改emp表
if语句
- 判断员工奖金在100和1000之间的奖金加500,打印出员工姓名、员工奖金
declare
v_ename VARCHAR2(10);
v_comm NUMBER(7, 2);
v_empno number(10);
begin
--查询
select ename, comm ,empno into v_ename, v_comm ,v_empno from emp01 where empno = &empno;
--打印
dbms_output.put_line('员工姓名:' || v_ename || '员工薪资:' || v_comm);
--判断
if (v_comm >100 and v_comm <1000) then
update emp01 set comm = 500 where empno = v_empno;
/* elsif 条件 then
执行语句;
elsif 条件 then
执行语句;
elsif 条件 then
执行语句;*/
else
--必须加可执行语句(不能为空)
null; --是可执行的语句,但是不会做任何的事情
end if;
end;
/*查看emp01是否被修改*/
select * from emp01;
- 判断员工工资在1000和2000之间则奖金加200,工资在2000和3000之间奖金加300,其他的奖金不变,打印出员工姓名和员工工资
declare
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--查询
select ename, sal into v_ename, v_sal from emp01 where empno = '7788';
--打印
dbms_output.put_line('员工姓名:' || v_ename || '员工薪资:' || v_sal);
--判断
if (v_sal between 1000 and 2000) then
--满足条件执行
update emp01 set comm = nvl(comm, 0) + 200 where ename = v_ename;
elsif (v_sal between 2000 and 3000) then
update emp01 set comm = nvl(comm, 0) + 300 where ename = v_ename;
else
--必须加可执行语句(不能为空)
null; --是可执行的语句,但是不会做任何的事情
end if;
end;
- 查询工号7788的员工姓名和工资
declare
type v_canshu is record( v_sal NUMBER(7, 2), v_ename emp.ename%type, v_emp emp%rowtype);
v_canshuji v_canshu;
begin
select sal, ename
into v_canshuji.v_sal, v_canshuji.v_ename
from emp
where empno=7788;
dbms_output.put_line(v_canshuji.v_sal || v_canshuji.v_ename);
end;
CASE
- 语法
CASE
WHEN 条件 THEN
执行事件;
WHEN 条件 THEN
执行事件;
ELSE
剩余条件下执行事件;
END CASE;
- 根据工资判断是否有钱
select empno,
ename,
sal,
(case
when sal between 1 and 1000 then
'初级'
when sal between 1000 and 2000 then
'中级'
when sal between 2000 and 3000 then
'高级'
else
'有钱人'
end) 等级
from emp1;
循环
while循环
declare
--声明变量
v_ano number := 1;
begin
--while循环(v_ano>10进入循环)
while (v_ano < 10) loop
--打印次数
dbms_output.put_line('while循环次数:' || v_ano);
--循环条件
v_ano := v_ano + 1;
--结束循环
end loop;
end;
loop循环
declare
--声明变量
v_bno number := 1;
begin
--loop循环
loop
--打印循环次数
dbms_output.put_line('loop循环次数:' || v_bno);
--执行操作
v_bno := v_bno + 1;
--循环退出条件
exit when v_bno > 10;
--结束循环
end loop;
end;
–3、for in 循环
declare
begin
--设置循环条件 v_cno 是变量,但是在for循环里面不需要声明
for v_cno in 1 .. 10 loop
dbms_output.put_line('for循环次数:' || v_cno);
end loop;
end;
对比(使用goto标记跳转)
declare
v_dno number := 1;
begin
--goto表示无条件跳转到指定的标记位置 注:不区分大小写
goto forxh;
while (v_dno < 10) loop
dbms_output.put_line('while循环:' || v_dno);
v_dno := v_dno + 1;
end loop;
loop
exit when v_dno > 20;
dbms_output.put_line('loop循环:' || v_dno);
v_dno := v_dno + 1;
end loop;
--<<标签分隔符>>
<<forxh>> --定义标记名称
for v_eno in 1 .. 10 loop
dbms_output.put_line('for循环' || v_eno);
end loop;
end;
使用游标
declare
e_emp emp%rowtype;
cursor s1 is select * from emp;
begin
for e_emp in s1 loop
case
when e_emp.sal <1000 then
dbms_output.put_line('初级'||e_emp.ename);
when e_emp.sal between 1000 and 2000 then
dbms_output.put_line('中级'||e_emp.ename);
when e_emp.sal between 2000 and 3000 then
dbms_output.put_line('高级'||e_emp.ename);
else
dbms_output.put_line('有钱人'||e_emp.ename);
end case;
end loop;
end;