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 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?选择器表达式
指定一个表达式,此表达式的值的数据类型与每个?匹配表达式?兼容。如果?选择器表达式?的值与第一个?匹配表达式?匹配,那么将执行相应 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月 ? ??
在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; ?? ??
?