Oracle-PLSQL
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;
??
??
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!