PLSQL编程介绍:
将一些数据的处理过程放在数据库上面,可以避免因为网络瓶颈造成的一些时间上的消耗。
可有利于系统的移植,大部分的数据处理和分析可以共享。
过程化编程语言,用来编写包含SQL语句的程序。可以向数据库应用程序中加入业务逻辑处理功能。
pl/sql结构
在PL/SQL中只能用 SQL语句中的DML部分,不能使用DDL部分,如果要在PL/SQL中使用DDL(如CREATE TABLE等)的话,只能以动态的方式使用。
PL/SQL程序由块结构组成,每一个块都包含有PL/SQL和SQL语句语法结构:
[DECLARE
-- 程序的声明部分,例如,定义变量
]
BEGIN
-- 程序的执行体,具体的操作代码
[EXCEPTION
-- 异常的处理
]
END ;
常量的赋值语法:
varName constant varType := varValue;
变量的几种赋值方式:
1: varName varType := varValue;
2: select into
3: varName user.table.column%type;
4: varCollecton user.table%type;
--1.使用select into 为变量赋值
declare
v_empno number; --员工编号。
begin
--将emp表中SMITH员工的编号赋值给v_empno并输出编号的值
select empno into v_empno from scott.emp where ename='SMITH';
dbms_output.put_line('v_empno 等于' || v_empno); --输出v_empno的值
end;
--2.求圆的面积(常量的使用)
declare
pi constant number :=3.14; --圆周率长值(注:pi的值为常量)
r number default 3; --圆的半径默认值3
area number; --面积。
begin
area:=pi*r*r; --计算面积
dbms_output.put_line(area); --输出圆的面积
end;
--3.求圆的面积(变量的使用)当PI等于另外一个值的时候,使用变量求出圆的面积(使用:= 方式给变量赋值)
declare
pi number :=3.14; --圆周率长值
r number default 3; --圆的半径默认值3
area number; --面积。
begin
pi :=45; -- 值可以改变
area:=pi*r*r; --计算面积
dbms_output.put_line(area); --输出圆的面积
end;
复合数据类型的使用:
%TYPE: 用于取得表、视图、或游标中的字段类型
%ROWTYPE: 用于取得表、视图或游标的行类型
--4.声明一个变量,变量的类型为scott.emp表的empno字段类型,然后在控制台输出
--声明一个变量,变量的类型为scott.emp表的整行的复合类型,然后在控制台输出
-- 声明一个变量,变量的类型为scott.emp表的empno字段类型
declare
id_num scott.emp.empno%type;
begin
select empno into id_num from scott.emp where ename='SMITH'; -- 为id_num赋值
dbms_output.put_line(id_num); -- 输出id_num中的值
end;
-- 声明一个变量,变量的类型为scott.emp表的整行的复合类型,然后在控制台输出
declare
emp_info scott.emp%rowtype;
begin
select * into emp_info from scott.emp where empno=7369;
-- 输出emp_info中的值
dbms_output.put_line(emp_info.empno ||',' || emp_info.ename);
end;
%type,%rowtype总结:
不需要知道被引用的表列或行的具体类型
如果被引用对象的数据类型发生改变,PL/SQL 变量的数据类型也随之改变
语法:
一、
IF <条件1> THEN
语句
[ELSIF <条件2> THEN
语句
ELSIF <条件n> THEN
语句]
[ELSE
语句]
END IF;
二、
CASE <变量>
WHEN <表达式1> THEN 语句1;
WHEN <表达式2> THEN 语句2;
...
WHEN <表达式n> THEN 语句n;
ELSE 语句;
END CASE;
1. 如果某个学生的Java成绩大于等于90分则打印奖励IPone6一个,否则打印继续努力
declare
java_score int;
begin
java_score:= '&请输入学生的Java成绩';
if java_score > 90 then
dbms_output.put_line('奖励IPone6一个');
else
dbms_output.put_line('继续努力');
end if;
end;
2. 如果某个学生的Java成绩大于等于90分,并且C语言成绩大于等于80分则奖励苹果电脑一台,
否则打印继续努力
declare
java_score int; -- Java成绩
c_score int; -- c语言成绩
begin
java_score:= '&请输入学生的Java成绩';
c_score:= '&请输入学生的C语言成绩';
if java_score >= 90 and c_score >= 80 then
dbms_output.put_line('奖励苹果电脑一台');
else
dbms_output.put_line('继续努力');
end if;
end;
3.某学生的分数>=90,则该学生成绩为“A”;如果该学生的分数在90-80之间,则该学生成绩为“B”;
如果该学生的分数在80-70之间,则该学生成绩为“C”;如果该学生的分数在70-60之间,则该学生成绩的分数在60以下,则该学生成绩为“不及格”。
declare
score integer;
grade char;
begin
score:='&请输入学生成绩'; --使用&符号可以接收用户的输入数据
if score >=90 then
grade:='A';
elsif score >=80 then
grade:='B';
elsif score >=70 then
grade:='C';
elsif score >=60 then
grade:='D';
else
grade:='F';
end if;
dbms_output.put_line('Your grade is '||grade);
end;
4.根据月份的值判断该月份所属季节
/*
冬季: 12,1,2
春季: 3,4,5
夏季: 6,7,8
秋季: 9,10,11
*/
declare
v_month number;
v_season varchar2(30);
begin
v_month:='&请输入月份'; --使用&符号可以接收用户的输入数据
if v_month = 12 or v_month=1 or v_month = 2 then
v_season:= '冬季';
elsif v_month = 3 or v_month=4 or v_month = 5 then
v_season:= '春季';
elsif v_month = 6 or v_month=7 or v_month = 8 then
v_season:= '夏季';
elsif v_month = 9 or v_month=10 or v_month = 11 then
v_season:= '秋季';
else
v_season:='月份错误';
end if;
dbms_output.put_line(v_month || '月份是'||v_season);
end;
5.某学生的分数>=90,则该学生成绩为“A”;如果该学生的分数在90-80之间,则该学生成绩为“B”;
如果该学生的分数在80-70之间,则该学生成绩为“C”;如果该学生的分数在70-60之间,则该学生成绩
为“D”;如果该学生的分数在60以下,则该学生成绩为“不及格”。(使用case 的方式来实现)
declare
score int;
v_level varchar(2); --成绩等级
begin
score:='&请输入成绩';
case
when score >= 90 then v_level:='A';
when score >= 80 then v_level:='B';
when score >= 60 then v_level:='C';
else v_level:= 'D';
end case;
dbms_output.put_line(v_level);
end;
LOOP
要执行的语句;
IF <条件语句> THEN
要执行的语句;
EXIT ; --条件满足,退出循环语句
END IF;
END LOOP;
6.case 高级用法,实现查询的行转列
-- 考试信息表
create table t_exam_info(
f_id int primary key,
f_name varchar2(30),
f_subject varchar(30),
f_score number(3,1)
);
insert into t_exam_info values(1, '德玛', '语文', 89);
insert into t_exam_info values(2, '德玛', '数学', 90);
insert into t_exam_info values(3, '德玛', '英语', 80);
insert into t_exam_info values(4, '亚希', '语文', 81);
insert into t_exam_info values(5, '亚希', '数学', 82);
insert into t_exam_info values(6, '亚希', '英语', 83);
insert into t_exam_info values(7, '卡特', '数学', 84);
insert into t_exam_info values(8, '卡特', '英语', 85);
select * from t_exam_info;
select f_name,
sum( case when f_subject = '语文' then f_score ELSE 0 END ) 语文,
sum( case when f_subject = '数学' then f_score ELSE 0 END ) 数学,
sum( case when f_subject = '英语' then f_score ELSE 0 END ) 英语
from t_exam_info
group by f_name
--1.要求声明变量,每次循环都需要为变量减少数字1,并输出结果。当变量值小于3时,退出循环操作。
declare
v1 integer:=10;
begin
loop
v1:=v1 - 1;
dbms_output.put_line('v1:' || v1);
if v1 < 3 then
dbms_output.put_line('The variable v1 is less than 3');
exit; --使用exit语句退出loop循环
end if;
end loop;
end;
LOOP
要执行的语句;
EXIT WHEN <条件语句>; --条件满足,退出循环语句
END LOOP;
declare
v1 integer:=10;
begin
loop
v1:=v1 - 1;
dbms_output.put_line('v1:' || v1);
exit when v1 < 3; --使用exit when(后面使用boolean表达式,如果该表达式返回true则退出当前循环)语句退出loop循环
end loop;
end;
WHILE <布尔表达式> LOOP
要执行的语句;
END LOOP;
--2.要求声明变量,每次循环都需要为变量增加数字1,并输出结果。当变量值小于20时,退出循环操作(while循环实现)。
declare
total integer:=0;
begin
while total < 20 loop
dbms_output.put_line('The valus of total is ' || total);
total:=total + 1;
end loop;
end;
FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP
要执行的语句;
END LOOP [循环标签];
--3.要求声明变量,然后再确定循环值的范围,每次循环都需要为变量增加数字1,并在最后输出循环次数
declare
total integer:=0;
begin
for i in 2..4 loop --使用for确定循环的值的范围
total:=total + 1;
end loop;
dbms_output.put_line('The total is ' || total);
end;
--4.使用循环打印以下图形
***
***
****
*****
练习嵌套循环
外层循环控制行
内层循环控制每一行打印的星星的个数
declare
begin
for i in 1..5 loop
for j in 1..i loop
dbms_output.put('*'); -- 不换行输出
end loop;
-- 打印完一行之后换行
dbms_output.put_line('');
end loop;
end;
-- 5.使用for循环打印九九乘法表
declare
begin
for i in 1..9 loop
for j in 1..i loop
dbms_output.put(j || '*' || i || '=' || (i * j) || ' ');
end loop;
dbms_output.put_line('');
end loop;
end;