ORACLE数据库笔记之PL/SQL
PL/SQL
PL/SQL是一种块结构的语言,它是将一组语句放在一个块中,一次性发送给服务器。它是结合Oracle过程语言和结构化查询语言的一种扩展语言
PL/SQL代码块的构成
declare --标记声明部分用来声明一些变量,位于begin之前
begin --主程序体开始的标志
主程序体块;
[exception
when 异常名 then 异常处理的方法;
when 异常名 then 异常处理的方法;
...
when other then 异常处理的方法;]
end; --主程序题结束的标志
PL/SQL的常量和变量
变量的定义:
declare --用来声明变量
变量名 变量类型; --直接定义不赋初值
变量名 变量类型:=变量值; --定义变量并且赋初值
变量名 匹配的数据库中原有的值; --直接使用数据库中原有的值来匹配
例(name person.name%type)
(其中%type可以引用表中某列的类型作为变量的数据类型,也可以引用变量的类型作为新变量的数据类型
%typeye也可以被换成是%ROWTYPE即引用数据库表中的一行作为变量的数据类型,也就是record类型,此变量就相当于是java中的一个对象,可以用‘.’来访问记录中的属性)
常量的定义:
常量名 constant 数据类型:=值; --注意constant是必须的
(宿主常量:定义和普通的常量定义一样,使用时为:变量名 代码如下:)
var emp_name varchar(30);
BEGIN
SELECT ename INTO :emp_name FROM emp WHERE empno=7499; ②
END;
PL/SQL中运算符
类型 符号 说明
赋值运算符 := PL/SQL中的赋值
特殊字符 || 字符串连接符
-- PL/SQL中的单行注释
/*,*/ PL/SQL中的多行注释,多行注释不能嵌套
<<,>> 标签分割符,只为了标示程序中的特殊位置
.. 范围操作符比如:1..5标示从1到5
算术运算符 + - * / 基础算术运算符
** 求幂操作例子:2**3=8
关系运算符 > ,< ,>=, <=, = 基本关系运算符
<>,!= 不等于运算符
逻辑运算符 and,or,not 逻辑运算符
PL/SQL程序的主体执行部分
赋值语句:
(1)接收用户的输入:
declare
n int; --定义一个变量来接收用户输入的数值
begin
n:=&a; --弹出一个消息框进行输入
end;
(2)从查询结果中赋值
set serveroutput on;
declare
n number(4);
begin
select empno into n from emp where='7369';
dnms_output.put(n);
end;
PL/SQL控制语句
(1)if 条件then 条件为真时执行 elsif … then end if;
判断if正确则执行then,否则执行else(elsif为嵌套判断)
注意elsif,里面少一下e.
(2)Case var when ... then when … then end
有逻辑的从数值中做出选择
(3)Loop exit end loop
循环控制,用判断语句执行exit
(4)Loop exit when … end loop
同上,当when为真时执行exit
(5)while 条件 loop 循环体 end loop
当while为真时循环
(6)for 循环变量 in [rerverse意思是反转即从上限想下限循环] 循环下限..循环管上限 loop 循环体 end loop
已知循环次数的循环
pl/sql中的异常
(1)常见的异常:
异常 含义
access_into_null 未初始化对象
case_not_found case中选项与用户输入不匹配
collection_is_null 给尚未初始化的表或者数值进行赋值
cursor_already_open 重新打开已经打开的游标
dup_val_on_index 重复值存储在唯一索引的数据中
invalid_cursor 执行非法的游标
invalid_number 字符串转换为数字
no_data_found 没有查找到请求的行
too_many_rows 返回多行
value_error 大小限制
zero_divide 以零做除数
(2)自定义异常
在declare中定义异常形式为:异常名 exception
自定义的异常需要触发,所以在发生可能发生异常的地方写raise 异常名
异常捕获
declafe
myexception exception;
myempno number;
begin
select empno into myempno from emp where empno='1234';
if myempno=null then
raise myexception;
exception
when myexception then
dbms_output.put_line('');
when others then
dbms_output.put_line('');
end;
(3)生抛异常
raise_application_error(error_number,error_message,[keep_error]);