概念和目的:
-
什么是PL/SQL?
-
PL/SQL(Procedure Language/SQL) 程序语言
-
PLSQL是Oracle对sql语言的过程化扩展
-
指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。(具有编程的能力)
-
为什么要学习plsql?
-
1.将sql逻辑写在db层,效率更高----数据库处理数据更专业,还不需要网络数据交换。
-
2.为存储过程、函数等打下基础,前提是学会plsql
结构分析:
--declare --声明部分:没有变量,则declare可以省略
--你不需要变量声明,则不需要写任何东西
BEGIN--程序体的开始:编写语句逻辑
--在控制台输出一句话:dbms_output相当于system.out类,内置程序包,put_line:相当于println()方法
dbms_output.put_line('Hello World');
--dbms_output.put('Hello World');
end;--程序体的结束
概念:程序包:dbms_output相当于java中的类(system.out),它是oracle自带的,内置.
调用程序包:dbms_output.put_line(‘Hello World!’)相当于java的方法
变量:
声明部分可以定义变量,定义变量的语法:
变量名 [CONSTANT] 数据类型;
常见的几种变量类型的定义方法,分两大类:
- 普通数据类型(char, varchar2, date, number, boolean, long):
- 特殊变量类型(引用型变量、记录型变量):
- 普通变量赋值:
在ORACLE中有两种赋值方式:
1,直接赋值语句 :=
2, 使用select …into … 赋值:(语法;select 值 into 变量)
示例:
--打印两个变量的值,两个变量的值分别采用两种不同的赋值方法:
DECLARE--声明变量
--姓名
v_name VARCHAR(20) :='Bo';--声明的时候直接赋值
--薪资
v_sal NUMBER;
--工作地点
v_local VARCHAR(200);
BEGIN --开始程序逻辑
--程序运行时赋值
--方法一:--直接赋值
v_sal :=9999;
--方法二:语句赋值
SELECT '上海' INTO v_local FROM dual;
--输出打印
dbms_output.put_line('姓名:'||v_name||',薪资:'||v_sal||',工作地点:'||v_local);
END;--程序结束
plsql中有两种不同的赋值方法:
一种是: 直接用:=来赋值
另一种:select 值 into 变量 from 表名。
- 引用型变量:
引用变量:引用表中字段的类型 (推荐使用引用类型)
%type 例: v_ename emp.ename%type;
使用emp表的字段ename的数据类型作为v_ename的数据类型.
示例:
--查询并打印7839号(老大)员工的姓名和薪水
DECLARE
--定义变量
--姓名
v_ename emp.ename%TYPE;--姓名使用的emp表中的ename的字段的数据类型
--薪水
v_sal emp.sal%TYPE;--你不需要关心具体什么数据类型了
BEGIN
--赋值
--注意:into前后字段名和变量名必须对应(不管是数据类型,还是个数,顺序)
--必须:查询的结果必须只有一个值,不能有多行记录
SELECT ename,sal INTO v_ename,v_sal FROM emp WHERE empno=7839;
--打印
dbms_output.put_line('7839号员工的姓名是:'||v_ename||',薪资'||v_sal);
END;
引用类型的好处:
- 使用普通变量定义方式,需要知道表中列的类型,而使用引用类型,不需要考虑列的类型
- 使用引用类型,当列中的数据类型发生改变,不需要修改变量的类型。而使用普通方式,当列的类型改变时,需要修改变量的类型
- 使用%TYPE是非常好的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。
- 记录型变量:
- 记录型变量,代表一行,可以理解为数组,里面元素是每一字段值。
- %rowtype 引用一条(行)记录的类型 例:v_emp emp%rowtype;
- 含义:v_emp 变量代表emp表中的一行数据的类型,它可以存储emp表中的任意一行数据。
记录型变量分量的引用方式:
示例:
--查询并打印7839号(老大)员工的姓名和薪水
DECLARE
--记录型变量
v_emp emp%ROWTYPE;--该变量可以存储emp表中的一行记录
BEGIN
--赋值
--默认情况下,必须是全字段赋值
SELECT * INTO v_emp FROM emp WHERE empno=7839;
--打印
dbms_output.put_line('7839号员工的姓名是:'||v_emp.ename||',薪资'||v_emp.sal);
END;
错误的使用:
- 记录型变量只能存储一个完整的行数据
- 返回的行太多了,记录型变量也接收不了