一,PLSQL有那些知识点:
1,PLSQL背景
2,PLSQL程序结构
3,变量与数据类型
4,运算符
5,PLSQL控制语句
6,PLSQL游标
7,HANDLE EXCEPTION
8,SUB PROGRAM
1,PROCEDURE
2,FUNCTION
9,PACKAGE
10,TRIFFER
二,PLSQL简介
PLSQL(Procedural Language/SQL)是再标准SQL的基础上增加啦过程化处理的语言。结构化模块化编程,良好的可移植性,良好的可维护性,提升系统性能。做什么,不管怎么做,缺少过程与控制语句,无算法描述能力。相比SQL扩展了变量和类型,控制结构,过程与函数,对象类型与方法。
PLSQL开发环境:
SQLPlus utility
GUI Develop Tools:
- Toad
- PLSQL Developer
PLSQL字符集
字母:A-Z,a-z
数字:0-9
空白:Tab Space,回车
符号:+_*/<>;:'@"%||&-/**/
PLSQL对大小写不敏感。
只有DML SQL可以直接在PLSQl中使用
使用ORACLE内置的DBMS_SQL包,可以使用动态SQL语句-动态SQL语句是在运行时生成一 个SQL串,将该喘提交给DBMS_SQL包来执行。
内置的SQL函数也能执行。
三,PLSQL程序结构
PLSQL块
-申明部分,DECLARE
- 执行部分,BEGIN
- 异常部分,EXCEPTION
例子:
DECLARE
v_StudentID NUMBER(5) := 1000;
v_FirstName VARCHAR(20);
BEGIN
SELECT first_name
INTO v_FirstName
FORM students
WHERE id = v_StudentID;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO log_table(info)
VALUES('Student 1000 does not exist!');
END;
是用sqlcode和sqlnum关键字来获得错误信息.
四,变量与数据类型
变量:
变量命名规则:字母开头,后跟任意的非空格字符,数字,货币符号,下划线或#,最大长度为30个字符。
变量命名约定:变量一v开头(v_VariableName),类型以t开头(t_TypeName),异常以e开头(e_ExceptionName),参数以p开头(p_ParameterName).
数据类型:
字面值:123 --数字;'123' 'hello' --字符串;TRUE FALSE --布尔;‘30-NOV-1992, 3:17 PM’-- 日期型
标量型:-数字,字符,布尔,日期
组 合:-RECORD,TABLE,VARRAY
参考型:(引用型)-REF CURSOR,REF OBJECT_TYPE;
L O B :----
1,标量类型(常用的)
NUMBER CHAR VARCHAR2,BOOLEAN,DATE
%TYPE:变量具有与数据库的表中的某以字段相同的类型。
例子:
1, v_FirstName VARCHAR2(20);
2, v_FirstName students.first_name%TYPE;
2,组合类型
1,RECORD
TYPE record_name IS RECORD(
fild1 type1 [NOTNULL][:=expr1],
fild2 type2 [NOTNULL][:=expr2],
...
fildn typen [NOTNULL][:=exprn]
);
如果一个字段没有限定NOT NULL,那么它必须由一个初始值。
所有没有初始化的字段都会初始化为NULL。
同类型的RECORD变量可以相互赋值。
也可以取其中的字段(recode_name.field_name)
查信表时,用SELECT * INTO V_RecodeName赋值,字段类型合顺序要一样。
2,%ROWTYPE
取表行的类型,相当与一个RECORD类型。
数据库名%ROWTYPE
例子:
DECLARE
v_StuRec Student%ROWTYPE --Student时表名。
3,TABLE
相当于map<int,T>
TYPE tabletype IS TABLE OF type INDEX BY BINARY_INTEGER;
表中的元素的类型可以时符合类型
行的数目的限制由BINARY_INTEGER的范围决定
KEY没有必要是随序的
当数据被插入表时,表锁需的空间就被分配了
例子:
DECLARE
TYPE t_StuTable IS TABLE OF Student%ROWTYPE INDEX
BY BINARY_INTEGER;
v_Student t_StuTable;
BEGIN
SELECT * INTO v_Student(1001)
FROM Student WHERE id = 1001;
END;
变量的作用于为从声明到END,且,内嵌的过程可以改变外部变量的值,内嵌过程的变量不能再外部过程中使用。
DECLARE
v_Num NUMBER(5,2);
BEGIN
v_Num := 123.45;
DECLARE
v_Ch VARCHAR2(10);
BEGIN
v_Num := 321.45;(内嵌的过程可以改变外部变量的值)
v_Ch := 'hello';
...
END;
-- v_Ch := 'good';(内嵌过程的变量不能再外部过程中使用)
...
END;
五,运算符
= 判断
:= 赋值
<> != ^= 不等于
|| 字符连接符
; 语句结束
<<label_name>> 设置标签
-- /**/ 注释
AND
OR
NOT
六,PLSQL控制语句
1,IF语句
IF boolean_expression1 THEN
...
ELSEIF boolean_expression2 THEN
...
ESLE
...
END IF;
条件为NULL于FALSE相同。
2,简单的循环语句
a,LOOP循环
LOOP
...
IF boolean_expression THEN
EXIT;
END IF;
--EXIT WHEN boolean_experssion;
END LOOP;
b,WHILE循环
WHILE boolean_expression LOOP
...
END LOOP;
c,FOR循环
FOR loop_counter IN [REVERSE] low_bound..high_bound LOOP
...
END LOOP;
变量不用在DECLEAR中声明,第一次循环会取low_bound。
d,GOTO语句
GOTO label_name;
只能由内部的语句块跳往外部块。
设置标签
<<label_name>>
e,NULL语句
可以在语句块中加空语句,用于补充语句的完整性。
IF v_idx > 40 THEN
...
ELSE
NULL;
END IF;
七,PLSQL游标
CURSOR用于提取多行数据集。涉及的操作有:声明游标;为查询打开游标;将结果提 取 出来,存入PLSQL变量中;关闭游标。
DECLARE
CURSOR cursor_name IS select_statement。
. ..
例子:
DECLARE
v_major students.major%TYPE;
CURSOR c_student IS
SELECT first_name,last_name
FROM students
WHERE major = v_major;
1,OPEN CURSOR
OPEN cursor_name;
Lock if select statement has "FOR UPDATE"。
2,FETCH FROM CURSOR
FRTCH有两种型式
- FETCH cursoR_name INTO var1, var2...;
- FETCH cursor_name INTO record_var;
3,CLOSE CURSOR
CLOSE cursor_name;
游标使用后应该关闭
-FETCH关闭后的游标是非法的。
-关闭一个关闭了的游标也是非法的。
4,游标的属性
-%FOUND
-%NOTFOUND
-%ISOPEN
-%ROWCOUNT
DEMO:
...
EXIT WHEN cursor_name%NOTFOUND;
...
5,游标的FETCH循环
-LOOP
FETCH cursor INTO...
EXIT WHEN cursor_name%NOTFOUND;
END LOOP
-WHILE cursor_name%FOUND LOOP
FETCH cursor INTO
END LOOP;
-FOR var IN cursor_name LOOP
--print var;
END LOOP;
6,带参数的游标
CURSOR可以带参数。
DECLARE
CURSOR c_student(p_major) students.major%TYPE)
SELECT * FROM students
WHERE major = p_major;
BEGIN
OPEN c_student(101);
...
多参数用‘,’隔开。
八,EXCEPTION
PLSQL有编译时错误,和运行时异常。
运行时异常类型:
1,异常处理块
DECLARE
...
BEGIN
...
EXCEPTION
WHEN OTHERS THEN
handler_error(...);
END;
2,用户自定义异常
DECLARE
e_TooManyStudents EXCEPTION;
. ..
BEGIN
...
RAISE e_TooManyStudents;
...
EXCEPTION
WHEN e_TooManyStudents THEN
...
END;
3,预定义的ORACLE异常
有ORACLE预定义的异常代码
如:
ORA-0001 - DUP_VAL_ON_INDEX --资源重复
异常操作
1,触发异常--抛出异常
RAISE exception_variable;
2,捕捉异常
EXCEPTION
WHEN e_TooManyStudents THEN
INSERT INTO log_file(info)
VALUES('Major 1100 has '||
v_CurStudents || 'max aloowed is' || v_Max);
WHEN OTHERS THEN --捕捉所有异常。
v_ErrCode := SQLCODE;
...
END;
九,SUB PROGRAM
×匿名块
-匿名块不存在数据库中
-每次使用时都会进行编译
-不能在其他块中调用
×带名块
-带名块存储在数据库中
-可以在任何需要的地方调用
-PROCEDURE,FUNCTION,PACKAGE,TRIGGER
1,PROCEDURE
CREATE [OR REPLACE] PROCEDURE procd_name
[(arg_name [{IN | OUT | IN OUT}] TYPE,
...
arg_name [{IN | OUT | IN OUT}] TYPE)]
{IS | AS}
procedure_body
不要制定参数的长度如:varchar2(10)
a,PROCEDURE的参数模式
×IN
-在调用过程中,实际参数的值被
传递给该过程,形参时只读的。
×OUT
-在调用过程中,任何的参数将被
忽略;在过程内部,形参时可写的。
×IN OUT
-是IN与OUT的组合,在调用过程的时
候,实参的值可以传递给该过程,在
过程内部,形参也可以被读出也可以
被写入,过程结束时,控制返回给控
制环境,而形参的内容将赋给调用时
的实际参数。****
×参数的缺省模式是IN.
b,过程主体
×过程主体是一个拥有声明,执行和异常处理的完整的PLSQL块。
×声明部在IS或AS关键字与BEGIN关键字之间。
×执行部分在BEGIN和EXCEPTION之间。
×异常部分在EXCEPTION与END之间。
例子:
CREATE OR REPLACE PROCEDURE ModeTest(
p_InParm IN NUMBER := 10,
p_OutParm OUT NUMBER,
p_InOut IN OUT NUMBER)
IS
v_LocaVar NUMBER;
...
BEGIN
v_LocaVar := p_InParm;
p_OutParm := p_InParm;
...
EXCEPTION
WHEN %NOFOUND THEN
...
END ModeTest;
c,调用PROCEDURE的例子
...
v ModeTest(10,v_var1,v_var2);
...
×指定实参的模式
×位置标示法
-调用的时候添入所有参数,
实参和形参按顺序一一对应。
×名字标示法
-调用时给出形参名字,并给出实参
ModeTest(12,p_OutParm => v_var1,
p_InOut => 10);
×两种方法可以混用
-混用时,第一个参数必须通过位置
来指定。
-名字标示法对于参数很多时,可提
高程序的可读性。
×使用缺省参数
-形参可以指明缺省值。
-位置标示法时,所有的缺省值都放在最后面
-使用名字标示法时无所谓
-如果使用了缺省值,尽量将缺省值放在参数的末尾。
2,FUNCTION
。。。
十,PACKAGE
。。。
十一,PRIGGER
。。。