Oracle 学习笔记第八天
PL/SQL的组成
- 变量和类型
- 控制语句
- 子程序和函数
- 对象类型和方法
PL/SQL的体系结构
- 将PL/SQL块发送给Oracle服务器
- Oracle服务器将PL/SQL代码分配给PL/SQL处理,将SQL代码分配给SQL语句执行器处理
PL/SQL块
PL/SQL块是构成PL/SQL程序的基本单元
将逻辑上相关的声明和语句组合在一起
PL/SQL分为三个部分,声明部分、可执行部分、异常处理部分
[DECLARE -- 声明部分
declarations]
BEGIN -- 执行部分
executable statements
[EXCEPTION -- 异常处理部分
handlers]
END;
/ -- 执行缓冲区的块
注意: / :执行缓冲区的块,/ 必须位与行的第一个字符,前面不允许有空格。当PL/SQL块中没有这个 / 时,块里面的内容不会执行,但是可以在执行块之后加上 / 使得块里面的内容得以执行。
PL/SQL默认是关闭输出的,就是如果需要通过执行块的内容来查看某些数据,PL/SQL是默认不输出的,需要打开输出后才能看到。
命令:set serveroutput on; – 打开PL/SQL的输出
注意:这里不再是选择SQL窗口,而是选择命令窗口;在编辑器里编辑好PL/SQL语句,然后执行,执行结果就会显示在对话框中。
-
变量和常量的声明
语法:variable_name [CONSTANT] data_type[(size)] [:=init_value]; 变量名 [是否为常量] 变量类型 := 值
Oracle中 := 代表赋值,判断相等只用一个 = 就行了
直接给变量赋值使用 :=
想通过查询结果赋值给变量: 在查询语句中 select 字段 into 变量名 from…
举例: DECLARE v_name VARCHAR2(20) :=‘张三’; -- 姓名 v_sal NUMBER DEFAULT 8000; -- 月收入 c_rate CONSTANT NUMBER(4,3):=0.023; -- 年利率 v_income NUMBER(10,3); -- 一年利息收入 BEGIN ......
注意:使用查询结果赋值时查询出来的结果只能是一个,如果为多个时就会报错。
变量的数据类型:
-
标量类型:
数字、字符、布尔型、日期时间
-
LOB类型:大对象类型
BFILE:字符大对象,可以用来保存小说等多字符文件
BLOB:二进制大对象,可以用来保存视频、音频等二进制文件
CLOB:
NCLOB:
-
属性类型
%TYPE:获取指定表的字段的类型或者指定变量的类型
%ROWTYPE:获取指定表的记录数据类型
-- %type 类型 set serveroutput on; declare v_name students.sname%type; --取students表的sname列的数据类型 v_sex students.ssex%type; v_age students.sage%type; v_birthday students.sbirthday%type; begin SELECT s.sname,s.ssex,s.sage,s.sbirthday INTO v_name,v_sex,v_age,v_birthday FROM students s WHERE s.sno = 109; dbms_output.put_line('学生姓名:'||v_name|| '性别:'||v_sex|| '年龄:'||v_age|| '生日:'||v_birthday); end; /
-- %rowtype 类型 set serveroutput on; declare v_students students%ROWTYPE; --取 students 表的记录类型,变量的结构和表的结构一致 begin SELECT * INTO v_students FROM students s WHERE s.sno = 109; dbms_output.put_line('学生姓名:'||v_students.sname|| '性别:'||v_students.ssex|| '年龄:'||v_students.sage|| '生日:'||v_students.sbirthday); end; /
-
替代变量
每次我们查询的时候学号都是确定的,很多时候我们查询不能每次查一个就修改一次代码,这是我们可以使用替代变量进行查询。
语法: &abc
-- abc表示提示信息,即当你运行程序时,就会显示一条内容为abc的提示信息
修改上面程序进行测试:
-- %rowtype 类型
set serveroutput on;
declare
v_students students%ROWTYPE; --取 students 表的记录类型,变量的结构和表的结构一致
begin
SELECT *
INTO v_students
FROM students s
WHERE s.sno = &学号;
dbms_output.put_line('学生姓名:'||v_students.sname||
'性别:'||v_students.ssex||
'年龄:'||v_students.sage||
'生日:'||v_students.sbirthday);
end;
/
控制结构
-
条件控制
-
if 控制
语法: IF <布尔表达式> THEN PL/SQL和SQL语句 ELSIF <布尔表达式> THEN 其他语句 ELSE 其他语句 END IF;
if 判断和我们之前学的编码里面的 if 是一个概念,唯一的区别就是 else if,Oracle中else if 的是 elsif ,还有就是Oracle if 语句判断完后还有一句 END IF。
-
case 控制
语法: CASE 条件表达式 WHEN 结果1 THEN 语句段1 WHEN 结果2 THEN 语句段2 ELSE 语句段 END CASE ;
这玩意类似编程中的switch case ,只是这边的when中条件是你选的,可以写不同的判断,但是这个case when 只要执行完一条就不会执行其他判断了,这点和switch类似,同时还要注意做后的 end case;
-
-
循环控制
-
LOOP 循环
语法 LOOP 要执行的语句; EXIT WHEN <条件语句>; END LOOP;
这个也没啥好说的,和编程的也有点像,只是要注意跳出循环的 exit when 语句,这个不能少,不然就无限循环了,当然还要注意最后的 end loop。
-
while循环
语法: WHILE <布尔表达式> LOOP 要执行的语句; END LOOP;
这个结构都和编程相似,不多解释。
-
for循环
语法: FOR 循环计数器 IN [REVERSE] 下限上限 LOOP 要执行的语句; END LOOP;
循环计数器就是定义的循环变量,后面的下限上限就是循环的取值范围,
这里的可选值 REVERSE ,如果加上这个值表示从上限到下限循环递减,如果不加则表示从下限到上限的循环递增。
-
-
顺序控制
这两个几乎不用,而且有坑,所以就不做介绍了。