2008/03/20
PL/SQL基础
1.PL/SQL基础
2.PL/SQL块结构
DECLARE
....变量声明
BEGIN
....
EXCEPTION
....
END;
/
变量声明的内容
赋变量适当的名称,变量正确的数据类型,定义变量,控件变量范围
命名规则
由字符开头,可以包含数了,下划线,$,#等,长度1-30,大小写不区分,不能是系统关键字
例:
DECLARE
X VARCHAR2(10); 定义变量区域
BEGIN
X:='THIS IS...'; 变量赋值
DBMS_OUTPUT.PUT_LINE('X的值为:'||X); ||是连接字符,不用转换类型
END 结束
/ 结束,并执行
默认是不输也的,我们可以用SET
SET SERVEROUTPUT ON SIZE 10000 //开启输出,输也量为10000
这时候重新L,执行就能输出结果了。
save c:\plsql.txt 保存起来上面的块。
DBMS_OUTPUT.PUT('X的值为:'||X); 意思是不输出
--行注释内容
/*..块注释....*/
X varchar2(10):='abce';定义并赋值
@ c:\sqlplus.txt 执行文件中的内容
3.分支语句的使用
一、IF分支
IF ... THEN
....
ELSE IF ....THEN
....
ELSE
.....
END IF
例:
DECLARE
a number;
b varchar2(10);
BEGIN
a:=2;
IF a=1 THEN
b:='a';
ELSIF a=2 THEN
b:='b';
ELSE
b:='C';
END IF;
DBMS_OUTPUT.PUT_LINE('b的值是:'||b);
END;
/
二、CASE分支
CASE
WHEN...THEN...
ELSE
END CASE
例:
DECLARE
a number;
b varchar2(10);
BEGIN
a:=2;
CASE
WHEN a=1 THEN b:='a';
WHEN a=2 THEN b:='b';
....
ELSE
b:='c';
END CASE;
DBMS_OUTPUT.PUT_LINE('b的值是:'||b);
END;
/
4.环循语句的使用
1.基本循环LOOP
LOOP
...
END LOOP
例:
DECLAE
X NUMBER;
BEGIN
X:=0;
LOOP
X:=X+1;
IF X>=3 THEN
EXIT;
END IF;
DBMS_OUTPUT.PUT_LINE('体内X的值分别是:'||X);
END LOOP;
DBMS_OUTPUT.PUT_LINE('外X的值是:'||X);
END;
/
2.WHILE循环
WHILE expression LOOP
...
END LOOP;
例:
DECLAE
X NUMBER;
BEGIN
X:=0;
LOOP
X:=X+1;
EXIT WHEN X>=3
DBMS_OUTPUT.PUT_LINE('体内X的值分别是:'||X);
END LOOP;
DBMS_OUTPUT.PUT_LINE('外X的值是:'||X);
END;
/
DECLAE
X NUMBER;
BEGIN
X:=0;
WHILE X<=3 LOOP
X:=X+1;
DBMS_OUTPUT.PUT_LINE('体内X的值分别是:'||X);
END LOOP;
DBMS_OUTPUT.PUT_LINE('外X的值是:'||X);
END;
/
3.FOR循环
FOR counter IN [REVERSE] start_value..end_value LOOP
...
END LOOP;
例:
BEGIN
FOR I IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('体内I的值分别是:'||I);
END LOOP;
DBMS_OUTPUT.PUT_LINE('END');
END;
/
FOR I IN REVERSE 1..5 LOOP 指的是倒着递增
GOTO语句的使用
DECLARE
X NUMBER;
BEGIN
X:=0;
<<REPEAT_LOOP>> 定义标记
X:=X+1;
DBMS_OUTPUT.PUT_LINE(X)
IF X<3 THEN
GOTO REPEAT_LOOP; 返回到标记处
END IF;
END;
/
5.异常处理的使用
1.什么是异常
在PL/SQL中的一个警告或错误的情形都被称为异常,包括编译时错误和运行时错误。
3.异常分类
系统异常,自定义异常
4.异常结构
EXCEPTION
WHEN...THEN
...
常见系统异常:
DUP_VAL_ON_INDEX:向有唯一约束的表中插入重复行
NO_DATA_FOUND:在一个SELECT INTO语句中无返回值
TOO_MANY_ROWS:SELECT INTO 语句返回了多行
VALUES_ERROR:一个算法,转换,截断或大小约束发生错误
ZERO_DIVIDE:发生被零除
......
例:
DECLARE
test varchar2(10);
BEGIN
SELECT name INTO test FROM deptment WHERE id='tt';
DBMS_OUTPUT.PUT_LINE(test);
END;
/
这是就会出现一个错误no data found
我们来设置一个异常补获:
DECLARE
test varchar2(10);
BEGIN
SELECT name INTO test FROM deptment WHERE id='tt';
DBMS_OUTPUT.PUT_LINE(test);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到数据');
END;
/
自定义异常:
DECLARE
tname varchar2(10);
e exception; 定义常规异常
BEGIN
SELECT name INTO tname FROM deptment WHERE id='01;
IF tname<>'B部门' THEN
RAISE e; 异常
END IF;
DBMS_OUTPUT.PUT_LINE(tname);
EXCEPTION 异常处理部分
WHEN e THEN
DBMS_OUTPUT.PUT_LINE('ERROR,不是要的B部门');
END;
/
6.记录的使用
什么是记录:记录是由几个相关值构成的复合变量,常用于支持SELECT语句的返回值,使用记录可以将一行数据看成一个单元进行处理,而不必将每一列单独处理
记录的声明
TYPE type_name IS RECORD(
Variable_name datatype[,
Variable_name datatype[,
....
);
Real_name type_name;
例:
DECLARE
TYPE myrecord IS RECORD(
id varchar2(10),
name varchar2(10);
);
real_record myrecord;
BEGIN
SELECT e_id,e_name INTO real_record FROM emp WHERE e_id='001';
DBMS_OUTPUT.PUT_LINE(real_record.id||','||real_record.name);
END;
/
Oracle学习笔记--复合数据类型
By 洛基 发表于 2007-4-6 14:54:00
1、PL/SQL记录
适用于处理单行多列数据
eg:
type emp_record_type is record(
name emp.ename%type,
salary emp.salary%type,
dno emp.detno%type
);
emp_record emp_record_type;
2、PL/SQL集合
适用于处理单列多行的数据
2.1 索引表
eg1:
type ename_table_type is table of emp.ename%type
index by binary_integer; --(还可以是pls_integer)
ename_table ename_table_type;
以下是两种放法:
.................
forall i in ename_table.first..ename_table.last
/* sql语句*/
...................
for i in 1..ename_table.count loop
/* sql语句 */
end loop
..............
eg2:
type ename_table_type is table of number
index by varchar(20);
ename_table ename_table_type;
................
ename_table('上海')=1;
ename_table('北京')=2;
..............
eg3:
ename_table.delete; --清空索引表的数据
2.2 嵌套表
下标从1开始,元素个数没有限制。
eg:
Type ename_table_type is table of emp.ename%type;
ename_table ename_table_type:=ename_table_type('A','A'); --必须要先初始化
......
dbms_output.put_line(ename_table(2));
......
2.3 变长数组
下标从1开始,元素的最大个数是有限制的
eg:
Type ename_table_type is varray(20) of emp.ename%type;
ename_table ename_table_type:=ename_table_type('A','A'); --必须要先初始化
3、PL/SQL 记录表
适用于多行多列数据
eg:
Type ename_table_type is table of emp%rowtype;
index by binary_integer;
ename_table ename_table_type;
------
select * bulk collect into ename_table from emp;
------
4、多级集合
用法都差不多
4.1多级VARRAY
4.2多级嵌套表
4.3多级索引表