plsql
sql: 结构化查询语言,
只注重 结果,不关心过程,
优点:
交互强,
数据库操纵能力强(DML DQL)
只需要发送命令,不需要关心如何实现
容易调试
plsql: 为了弥补sql的不足
在sql的基础上添加了一些过程化控制语句 (if,while)
plsql 强调过程,
要求 每一条语句的结束 都要以 分号 ; (英文) 结束
语法:
[declare 变量名 类型:=初值;] -- 声明变量
begin
--语句序列;
[exception] -- 发生错误时处理
end;
注意事项:
a. 要求 所有的语句 必须以 英文分号 结束
b. 如果 需要声明变量,则使用declare 然后 先写 变量名 变量类型:=初值; 如果 没有初值 则不用写 :=值
c. begin end; 必须 都存在 注意 end 后面要有 分号
d. 变量 赋值 需要使用 变量名:=值, := :=
e. 在plsql中 字符串连接 使用 ||
简单输出
-- plsql 简单输出 begin -- 输出语句 dbms_output.put_line('hello plsql'); dbms_output.put_line('你好 plsql'); end;
定义变量
-- plsql 定义变量 ,需要指定变量的类型 -- 先写变量名 变量类型 declare sname varchar2(40); -- 定义变量 begin sname:='李四'; -- 给变量赋值 := dbms_output.put_line(sname); -- 输出变量值 dbms_output.put_line('你好,'||sname); -- 你好,李四 end;
-- 练习 , 请定义2个变量, 输出 我叫XXX, 我的年龄是XXX岁 declare myname VARCHAR2(30):='张丽丽'; myage number; begin myage := 20; dbms_output.put_line('我叫'||myname||', 我的年龄是'||myage||'岁'); end;
-- 输出 员工编号为 1001的 员工姓名及薪资 --select ename,salary from emp where eno=1001; -- 解题思路: 先查询 ,再输出 declare myname varchar2(50); mysal number; begin -- 查询 sql select ename,salary into myname,mysal from emp where eno=1001; dbms_output.put_line(myname || ', '||mysal); -- 当没有查询到数据时,显示 无此数据信息 no_data_found exception when no_data_found then dbms_output.put_line('查无此人或找不到相关数据'); end;
if
IF语句实现条件分支逻辑。
IF语句有三种风格:
- IF THEN END IF;
- IF THEN ELSE END IF;
- IF THEN ELSIF ELSE END IF;
-- plsql 中 if语句 -- 如果 sex 值 0 输出 男 /* 语法: if 条件 then 条件成立时执行语句 ; --当条件成立时 执行then 后面的语句 else 条件不成立的执行语句; end if; --结束if */ declare bsex VARCHAR2(2):='0'; begin if bsex='1' then dbms_output.put_line('女'); else dbms_output.put_line('男'); end if; end;
-- 定义一个变量, 判断变量值 是否为 李四, 如果相等输出 就是李四 declare myname VARCHAR2(30):='22四'; begin if myname='李四' then dbms_output.put_line('就是李四'); else dbms_output.put_line('不是李四'); end if; end; -- 显示 今天是 星期几? 是 工作日还是休息日 --select to_char(sysdate,'day') from dual; declare myday varchar2(20); --声明变量 begin select to_char(sysdate,'day') into myday --查询,并为变量赋值 from dual; dbms_output.put_line('今天是'||myday); -- 对 myday进行判断 if myday in ('星期六','星期日') then dbms_output.put_line('今天是休息日'); else dbms_output.put_line('今天是工作日'); end if; end; select to_char(sysdate,'yyyy') from dual; select EXTRACT(year from sysdate)from dual;
case
CASE 选择器表达式
指定一个表达式,此表达式的值的数据类型与每个 匹配表达式 兼容。如果 选择器表达式 的值与第一个 匹配表达式 匹配,那么将执行相应 THEN 子句中的语句。如果没有匹配项,那么将执行相应 ELSE 子句中的语句。如果没有匹配项,并且没有 ELSE 子句,那么将抛出异常。
WHEN 匹配表达式
指定要在 CASE 语句中进行求值的表达式。如果 选择器表达式 与某个 匹配表达式 匹配,那么将执行相应 THEN 子句中的语句。
THEN
此关键字引入要在相应布尔表达式求值为 TRUE 时执行的语句。
statement
指定一个或多个 SQL 或 PL/SQL 语句,每个语句都以分号终止。
ELSE
此关键字引入 CASE 语句的缺省情况。
/* 语法: case when 条件1 then 语句1; when 条件2 then 语句2; when 条件3 then 语句3; else 语句4; end case; */ declare mynum number:=20; -- 成绩 info varchar2(50); -- 优良中差 begin case when mynum>90 then info:='优秀'; when mynum>80 then info:='良好'; when mynum>60 then info:='中等'; else info:='不及格'; end case; dbms_output.put_line(info); end; -- 定义一个变量, 如果变量 等于2 输出 2月, 9 9月
loop
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列。常用的LOOP循环语句包含3种形式:基本的LOOP、WHILE...LOOP和FOR...LOOP。
-- 定义 plsql 输出 1-100之间的 每一个数 101 declare i number :=1; begin while i<=100 loop dbms_output.put_line(i); i:=i+1; end loop; end; /* plsql 中 循环的语法: 1. while 循环 while 循环条件 ---- 这里不能写 分号 loop -- 重复的语句 (循环体) , end loop; 2.loop 循环 loop exit when 条件; -- 满足条件时 结束 , 这里 一定要有分号 --循环体 end loop; 3.for 循环 for i in 初始值 .. 结束值 loop --循环体 end loop; */ -- 循环输出 1-100 之间所有的奇数, 循环结束了 --- while 循环 declare i number :=1; begin while i<=100 loop dbms_output.put_line(i); i:=i+2; end loop; dbms_output.put_line('while循环结束了'); end; --循环输出 1-100 之间所有的奇数, 循环结束了 -- loop循环 declare i number:=1; begin loop exit when i>100; dbms_output.put_line(i); i:=i+2; end loop; dbms_output.put_line('loop循环结束了'); end; -- 利用循环 输出 50次 ' 这是第50次 的 select * from emp ' (利用2中 循环来做) declare num number:=0; begin for num in 1 .. 50 loop dbms_output.put_line('这是第'||num||'次的 xxxxxxx'); end loop; end; select * from dept; -- 循环 往 dept 表 插入 10条数据 declare num number:=1; begin while num<11 loop -- --dbms_output.put_line(num); insert into dept(depid,depname) values(num*10+num,'测试循环数据'||num); num:=num+1; end loop; end; -- 循环 删除dept表里的 10条数据 delete drop declare num number:=1; begin loop exit when num>10; -- 删除 delete from dept where depid=(num*10+num); dbms_output.put_line('成功删除'|| num); num:=num+1; end loop; dbms_output.put_line('成功删除'); end; -- 1+2+3+4+5+6+....+100 = 5050 ? /* sum=0; 放1 , sum= 0+1=1; 放2 , sum= 1+2=3; 放3 , sum= 3+3=6; 放4 , sum= 6+4=10; 放5 , sum= 10+5=15; 放i, sum = sum+i; */ declare i number:=1; psum number:=0; -- 不能用sum begin loop exit when i>100; psum:=psum+i; -- 计算和 i:=i+1; -- 自增1 end loop; dbms_output.put_line('结果为'||psum); end; begin for r in 1..100 loop if mod(r,2)=0 then dbms_output.put_line('结果为'||r); end if; end loop; end;