1, PL/SQL简介: PL/SQL是ORACLE的过程化语言,包括一整套的数据类型、条件结构、循环结构和异常处理结构,PL/SQL可以执行SQL语句,SQL语句中也可以使用PL/SQL函数。
2,PL/SQL优点和特性:
a,提高运用程序的运行性能
b,提供模块化的程序设计功能
c,允许定义标示符
d,具有过程语言控制结构
e,具备良好的兼容性
f,处理运行错误
3,PL/SQL块:
DECLARE…定义部分-变量,常量,游标,例解BEGIN…执行部分-PL/SQL,SQL语句EXCEPTION--异常处理部分-处理运行错误END;--块结束标志 注意:declare,begin,exception后面没有分号,而end后则必须要有分号
declare v_name varchar2(20);beginselect ename into v_name from scott.emp where empno=&empno;dbms_output.put_line('员工姓名:'||v_name);exceptionwhen no_data_found then dbms_output.put_line('请输入正确的员工工号!');end
4,PL/SQL数据类型:
名称 | 类型 | 说明 |
NUMBER | 数字型 | 能存放整数值和实数值,并且可以定义精度和取值范围 |
BINARY_INTEGER | 数字型 | 可存储带符号整数,为整数计算优化性能 |
DEC | 数字型 | NUMBER的子类型,小数 |
DOUBLE PRECISION | 数字型 | NUMBER的子类型,高精度实数 |
INTEGER | 数字型 | NUMBER的子类型,整数 |
INT | 数字型 | NUMBER的子类型,整数 |
NUMERIC | 数字型 | NUMBER的子类型,与NUMBER等价 |
REAL | 数字型 | NUMBER的子类型,与NUMBER等价 |
SMALLINT | 数字型 | NUMBER的子类型,取值范围比INTEGER小 |
VARCHAR2 | 字符型 | 存放可变长字符串,有最大长度 |
CHAR | 字符型 | 定长字符串 |
LONG | 字符型 | 变长字符串,最大长度可达32,767 |
DATE | 日期型 | 以数据库相同的格式存放日期值 |
BOOLEAN | 布尔型 | TRUE OR FALSE |
ROWID | ROWID | 存放数据库的行号 |
5,标量类型:a,varchar2(20):用于可定长度的字符串,最大长度32767,其值的长度不超过2000字节
b,char(n):定义固定长度的字符串,如果不指定n的值,n默认为1
c,number(p,s):定义固定长度的整数和浮点数,其中p用于指定数字的总位数,s用于指定小数点后的数字位数
d,date:定义日期和时间类型,其数据长度定为7个字节长度
e,timestamp:定义日期和时间数据,赋值方法和date类型的赋值方法一致,而且还会显示时间,上下午标志和时区
f,boolean:定义布尔变量,其变量的值为true,false或null
6,PL/SQL控制结构:
IF语句
1 BEGIN2 IF 1 = 2 THEN3 DBMS_OUTPUT.PUT_LINE('1=2');4 END IF;5 END;
IF/ELSE语句
1 BEGIN2 IF 1 = 2 THEN3 DBMS_OUTPUT.PUT_LINE('1=2');4 ELSE5 DBMS_OUTPUT.PUT_LINE('1<>2');6 END IF;7 END;
IF/ELSEIF/ELSE语句
1 BEGIN2 IF 1 > 2 THEN3 DBMS_OUTPUT.PUT_LINE('1 > 2');4 ELSIF 1 < 2 THEN5 DBMS_OUTPUT.PUT_LINE('1 < 2');6 ELSE 7 DBMS_OUTPUT.PUT_LINE('1 = 2');8 END IF;9 END;
LOOP循环,基础LOOP循环
1 DECLARE2 V_COUNT NUMBER := 0;3 BEGIN4 LOOP5 V_COUNT := V_COUNT + 1;6 DBMS_OUTPUT.PUT_LINE('循环到:' || V_COUNT);7 EXIT WHEN V_COUNT = 10;8 END LOOP;9 END;
LOOP循环,while__LOOP循环
1 DECLARE2 V_COUNT NUMBER := 0;3 BEGIN4 WHILE V_COUNT < 10 LOOP5 V_COUNT := V_COUNT + 1;6 DBMS_OUTPUT.PUT_LINE('循环到:' || V_COUNT);7 END LOOP;8 END;
LOOP循环,FOR----LOOP循环
1 BEGIN2 FOR IDX IN 1 .. 10 LOOP3 DBMS_OUTPUT.PUT_LINE('循环到:' || IDX);4 END LOOP;5 END;
7,异常处理:Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。为了提高程序的健壮性,可以在PL/SQL块中引入异常处理部分,进行捕捉异常,并根据异常出现的情况进行相应的处理。
一、异常的类型
ORACLE异常分为两种类型:系统异常、自定义异常。
其中系统异常又分为:预定义异常和非预定义异常。
1.预定义异常
ORACLE定义了他们的错误编号和异常名字,常见的预定义异常处理Oracle常见的错误
NO_DATA_FOUND SELECT ... INTO ... 时,没有找到数据
DUL_VAL_ON_INDEX 试图在一个有惟一性约束的列上存储重复值
CURSOR_ALREADY_OPEN 试图打开一个已经打开的游标
TOO_MANY_ROWS SELECT ... INTO ... 时,查询的结果是多值
ZERO_DIVIDE 零被整除
2.非预定义异常
ORACLE为它定义了错误编号,但没有定义异常名字。我们使用的时候,先声名一个异常名,
通过伪过程PRAGMA EXCEPTION_INIT,将异常名与错误号关联起来。
3.自定义异常
程序员从我们业务角度出发,制定的一些规则和限制。
二、异常处理
PL/SQL中,异常处理按个步骤进行:
定义异常
抛出异常
捕获及处理异常
a.定义异常
exception_name EXCEPTION;
b.抛出异常
RAISE exception_name
c.捕获及处理异常
EXCEPTION
WHEN e_name1 [OR e_name2 ... ] THEN
statements;
WHEN e_name3 [OR e_name4 ... ] THEN
statements;
......
WHEN OTHERS THEN
statements;
END;
8,游标:
(1).定义
映射在结果集中某一行数据的具体位置,类似于C语言中的指针。即通过游标方式定位到结果集中某个特定的行,然后根据业务需求
对该行进行相应特定的操作。
(2).游标的分类
显示游标:即用户自定义游标,专门用于处理select语句返回的多行数据
隐式游标:系统自动定义的游标,记录集只有单行数据,用于处理select into 和DML语句
(3).游标使用的一般过程:
显示游标:声明, 打开, 读取, 关闭
隐式游标:直接使用读取,声明、打开、关闭都是系统自动进行的
(4).显示游标的过程描述
a.声明游标
CURSOR cursor_name IS select_statement
如:CURSOR emp_cur IS SELECT empno,ename,job,sal FROM scott.emp;
b.打开游标
OPEN cursor_name --打开游标则执行对应的select语句,将对应的结果集存放到游标当中
如:OPEN emp_cur
c.读取数据
FETCH cursor_name INTO var_name1,...var_name2 ; --提取单行数据,需要配合循环语句来使用
FETCH cursor_name BULK COLLECT INTO collect1,collect2,...[LIMIT rows]; --提取多行数据,collect为集合变量
d.关闭游标
CLOSE cursor_name
(5).显示游标的个属性
cursor_name%ISOPEN 游标是否打开
cursor_name%FOUND 最近的FETCH是否提取到数据
cursor_name%NOTFOUND 最近的FETCH是否没有提取到数据
cursor_name%ROWCOUNT 返回到目前为止,已经从游标缓冲区中提取到数据的行数
(6).游标FOR循环:
游标FOR循环是为了简化游标使用过程而设计的。使用游标FOR循环检索游标时,游标的打开、数据提取、数据是否检索到的判断与游标
的关闭都是ORACLE系统自动进行的。
格式一: 先在定义部分定义游标,然后在游标FOR循环中引用该游标 FOR record_name IN cursor_name LOOP statement1; statement2; END LOOP; 格式二: 在FOR循环中直接引用子查询,隐式定义游标 FOR record_name IN subquery LOOP statement; END LOOP;
(7).参数游标
参数游标是指带有参数的游标。当定义了参数游标后,使用不同的参数值多次打开游标则会生成不同的结果集。
定义参数游标: CURSOR cursor_name (para_name1 datatype [,para_name2 datatype ...]) IS select_statement;
心得:游标太难懂了