Oracle_Day09(PLSQL编程、PL\SQL块)
PLSQL编程
- PL /SQL是一种高级数据库程序设计语言
- 该语言集成于数据库服务器中
- PL/SQL代码可以对数据进行快速高效的处理
PL/SQL包括两部分,一部分是数据库引擎部分;另一部分是可嵌入到许多产品(如C语言,JAVA语言等)工具中的独立引擎。可以将这两部分称为:数据库PL/SQL和工具PL/SQL
PLSQL与SQL的处理数据的区别
--示例1 : 为每一位职员涨薪10%
Update emp set sal = sal * 1.1
按照员工的职位进行涨薪 ,总经理涨薪10000元,部门经理涨薪8000元 其他员工统一涨薪1000元
PL/SQL块
PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。
PL/SQL块的结构如下:
DECLARE
/* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 */
BEGIN
/* 执行部分: 过程及SQL 语句 , 即程序的主要部分 */
EXCEPTION
/* 执行异常部分: 错误处理 */
END;
--其中,执行部分是必须的
PL/SQL块可以分为三类:
- 无名块:动态构造,只能执行一次。
- 子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们。
- 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
--PL/SQL Hello World
DECLARE /* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 */
str varchar2(18);
i number;
BEGIN /* 执行部分: 过程及SQL 语句 , 即程序的主要部分 */
str := 'HelloWorld';
i := 'aaa';
dbms_output.put_line(str);
dbms_output.put_line(i);
EXCEPTION /* 执行异常部分: 错误处理 */
when others then
dbms_output.put_line('输出有误');
END;
str varchar2(18); 声明一个变量 变量名称在前 类型在后
str := ‘HelloWorld’; 为变量str赋值 := 是一个赋值运算符
dbms_output.put_line(str); 输出语句 相当于System.out.println();
DECLARE /* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 */
V_name varchar2(18);
V_number := 45;
--如果变量在声明时使用了NOT NULL,则必须为变量指定初始值,
i number not null := 10;
--如果变量在声明时使用了CONSTANT,则必须为变量指定初值,并且初值不可改变。
i CONSTANT number := 10;
变量类型:
记录类型:
DECLARE
TYPE record_type is RECORD(--相当于Java中的类
name varchar2(20),
age number
);
V_stu record_type;
begin
V_stu.name :='张三';
V_stu.age := 23;
dbms_output.put_line(V_stu.name || V_stu.age);
end;
DECLARE
TYPE record_type is RECORD(--相当于Java中的类
name varchar2(20),
age number not null := 20--使用not null 必须赋初值
);
V_stu record_type;
begin
V_stu.name :='张三';
-- V_stu.age := 23;
dbms_output.put_line(V_stu.name || V_stu.age);
end;
引用类型:
-- 使用plsql程序来查询员工的姓名
declare
emprec emp.ename%type;
begin
select ename into emprec from emp where empno=7369;
dbms_output.put_line(emprec);
end;
RowType:
-- 查询某一个员工的信息
declare
e emp%rowtype;
begin
select * into e from emp where empno=7369;
dbms_output.put_line(e.ename|| ' ' || e.job);
end;
运算符:
关系运算符:
一般运算符:
逻辑运算符:
在程序中输入一个值 根据输入的值 来输出不同的内容:
--在程序中输入一个值 根据输入的值 来输出不同的内容
declare
done boolean;
begin
done := &done;--该变量的值 有用户输入
dbms_output.put_line(
case
when done is null then 'unknow'
when done then 'yes'
when not done then 'no'
end
);
end;
--循环输出10--1的数字
declare
n number;
begin
n := 10;
while n > 0 loop
dbms_output.put_line(n);
n := n -1;
end loop;
end;
使用plsql完成对数据库赋值 :
-- 根据工号查询员工的 姓名 年薪
declare
emp_id emp.empno%Type := &emp_id;
emp_name emp.ename%type;
year_sal emp.sal%type;
begin
select ename,(sal + NVL(comm,0) ) * 12 into emp_name,year_sal
from emp where empno = emp_id;
dbms_output.put_line(emp_name ||' '|| to_char(year_sal));
end;
-- 给Emp表中插入一条记录
declare
v_ename varchar2(20) := 'bill';
v_sal number(7,2) := 1234.56;
v_deptno number(2) := 10;
v_empno emp.empno%Type := 1086;
begin
insert into emp (empno,ename,sal,deptno)
values(v_empno,v_ename,v_sal,v_deptno);
commit;
end;
分支结构:
If分支
语法1 : if 条件 then 语句;
End if;
语法2: if 条件 then 语句1;
Else 语句2
End if;
语法3:if 条件 then 语句1;
Elsif 条件 then 语句2;
Elsif 条件 then 语句3;
…
Else 语句n;
End if;
-- 从键盘输入数字1 则输出 ‘您输入的值为1’
declare
pnum number := &pnum;
begin
if pnum = 1 then
dbms_output.put_line('您输入的值为1');
end if;
end;
-- 从键盘输入数字1 则输出 ‘您输入的值为1’ 否则 输出‘您输入的值不为1’
declare
pnum number := &pnum;
begin
if pnum = 1 then
dbms_output.put_line('您输入的值为1');
else
dbms_output.put_line('您输入的值不为1');
end if;
end;
-- 查询员工的薪资 如果薪资 < 1000 则输出工资等级为一级 1000--2000 为二级 2000--3000为三级 3000以上为四级
-- 7369 1086 7782 7902
declare
v_sal emp.sal % type;
v_empno emp.empno%type := &v_empno;
begin
select sal into v_sal from emp where empno=v_empno;
if v_sal < 1000 then
dbms_output.put_line('一级');
elsif v_sal >= 1000 and v_sal <2000 then
dbms_output.put_line('二级');
elsif v_sal >= 2000 and v_sal <3000 then
dbms_output.put_line('三级');
else
dbms_output.put_line('四级');
end if;
end;