1.pl/sql介绍
plsql是对标准的sql的扩展,扩展了可编程语言的特点
在plsql中可以具备编程性语言具备的特征
* 定义变量
* 数据类型
* 分支结构
* 循环结构
* 数组
* 函数/存储过程
2.pl/sql的好处
模拟银行转账
java代码实现:业务方法
账户加
账户减
记录你的历史记录
记录对方的历史记录
----需要调用dao的方法,访问数据库n次,完成一个业务操作,降低系统的响应速度
psql代码实现:业务方法
将转账的过程中需要的n个sql语句,进行打包
直接打包到数据库----plsql模块化编程
zhuanzhang : sql1.....sqln
----提高了数据库的交互效率
----plsql解决复杂的业务问题(n次和数据库的交互业务)
3.plsql的基础语法
plsql块:相当于java中代码块(java:{})
declare
--声明变量
begin
--实现代码功能(代码语句)
end;
4.数据类型的学习
-- 标量类型 varchar,varchar2,number,datatime,boolean,%type,%rowtype
-- 符合类型 table record
5.简单的变量声明和赋值
DECLARE
--声明变量
v_name VARCHAR(30);
v_age NUMBER(3);
BEGIN
--变量的赋值方式一
v_name:='张三';
v_age:=23;
-- 变量赋值方式二 select sname,age into v_name,v_age from student where sno=1;
--打印变量的值
dbms_output.put_line(v_name||' '||v_age);
END;
输出:
6.将表中的数据赋值给相应的变量
--%type 使用拷贝表中某个列的数据类型
--定义变量,将表中的数据赋值给响应的变量
DECLARE输出
--定义变量
v_name student.sname%TYPE;
v_age student.age%TYPE;
BEGIN
--赋值
SELECT sname,age INTO v_name,v_age FROM student WHERE ssid=1;
--打印变量的值
dbms_output.put_line(v_name ||' '||v_age);
END;
输出:
7.用rowtype声明一个集合
DECLARE
--拷贝student表中所有列的数据类型
v_r student%ROWTYPE;
BEGIN
--将student表中ssid=1的所有数据赋值给v_r集合
SELECT * INTO v_r FROM student WHERE ssid=1;
dbms_output.put_line(v_r.sname||' '||v_r.age||' '||v_r.ssex);
END;
输出:
8.用record声明一个类
DECLARE
--自定义record数据类型
TYPE record_type IS RECORD(
v_name student.sname%TYPE,
v_age student.age%TYPE
);
--声明record_type的变量
v_r record_type;
BEGIN
--给v_r变量 赋值
SELECT sname,age INTO v_r.v_name,v_r.v_age FROM student WHERE ssid=1;
dbms_output.put_line(v_r.v_name||' '||v_r.v_age);
END;
9.用table声明一个数组
DECLARE
--自定义table数据类型
TYPE type_table IS TABLE OF VARCHAR(30) --声明数组中数据类型
INDEX BY VARCHAR(1); --声明数组下标的数据类型
v_tt type_table; --声明type_table的变量
BEGIN
--变量赋值
v_tt('a'):='张三';
v_tt('b'):='李四';
v_tt('c'):='王二';
dbms_output.put_line(v_tt('a'));
dbms_output.put_line(v_tt('b'));
dbms_output.put_line(v_tt('c'));
END;
输出:
10.if...else....流程控制结构
--如果v_gread等于1,显示一颗星,否则显示两颗星
DECLARE
v_gread NUMBER(3):=2;
BEGIN
IF v_gread=1 THEN
dbms_output.put_line('★');
ELSE
dbms_output.put_line('★★');
END IF;
END;
11.case...end结构
--查询student表的ssid、sanme、age、ssex列,age后面别忘加引号,后面还有个ssex
select ssid,sname,age,
case
when ssex='1' then 'm' --当ssex等于1时显示为f
when ssex='0' then 'f' ---等于0时显示为m
when ssex is null then 's' --为空值时显示为s
end ssex --被判断的值放在后面
from student
输出:
12.decode 函数,相当于java中的switch case语句,可用来处理表中列的纵横转换
select decode(3,1,'a',2,'b',3,'c','d') from dual;
上面sql语句相当于java中:
switch(3)
{
case 1:
sout('a');
break;
case 2:
sout('b');
break;
case 3:
sout('c');
break;
default:
sout('d');
}
使用decode函数完成表的纵横列转换:
为了演示效果,我设计了一张比较奇怪的表:
sql语句:
select sname,
min(decode(cname,'语文',score)) AS 语文,
min(decode(cname,'数学',score)) AS 数学,
min(decode(cname,'英语',score)) AS 英语
from score
group BY sname
输出结果,完成转换:
13.loop 循环结构
--求1..100的和
DECLARE
v_sum NUMBER(5):=0;
v_index NUMBER(5):=1;
BEGIN
LOOP
v_sum:=v_sum+v_index;
v_index:=v_index+1;
IF v_index>100 THEN
EXIT;
END IF;
END LOOP;
dbms_output.put_line(v_sum);
END;
14.for循环
DECLARE
v_sum NUMBER(5):=0;
BEGIN
FOR v_index IN 1..100 LOOP
v_sum:=v_sum+v_index;
END LOOP;
dbms_output.put_line(v_sum);
END;
15.while循环
DECLARE
v_sum NUMBER(5):=0;
v_index NUMBER(3):=1;
BEGIN
WHILE v_index<=100 LOOP
v_sum:=v_sum+v_index;
v_index:=v_index+1;
END LOOP;
dbms_output.put_line(v_sum);
END;
这是答案:
网友评论