oracle/PL/SQL编程(3)
一、PL/SQL的概念
PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。
PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。
二、PL/SQL的结构写法
程序块:
DECLARE -- (可选语句块)申明块,用于申明变量、常量、异常、游标
BEGIN -- (必选)执行语句块开始
EXCEPTION -- (可选)异常捕获语句块
END; -- (必选)执行语句块结束
三、变量的定义、赋值符、输入符和打印输出
DECLARE
a NUMBER; -- 定义一个数值类型的变量a
b VARCHAR(20) DEFAULT '字符串'; -- 定义一个字符类型的变量,赋初始值为'字符串'
c NUMBER; -- 定义一个数值类型的变量c
BEGIN
a := 10; -- 赋值符':=' 赋值为10
c := '&请输入...'; -- 从键盘输入,赋值给c
dbms_output.put(a); -- 打印输出语句
dbms_output.put_line(b); -- 打印输出语句换行
dbms_output.put_line(c); -- 打印输出语句换行
END;
特殊类型和特殊赋值
❶字段类型:“%type”指定和表字段的类型一样
例:定义:ename emp.ename%type;
赋值:SELECT emp.ename INTO ename FROM emp WHERE emp.empno = 7788;
❷行类型:“%rowtype”指定和表的一行字段一样
例:定义:row emp%rowtype;
赋值:SELECT emp.* INTO row FROM emp;
四、顺序结构、条件结构和循环结构
(1)顺序结构
❶ 程序正常执行是顺序执行
❷ 可以使用“goto”关健字跳至“<<>>”标记点执行
例:
BEGIN
GOTO cod1;
dbms_output.put_line('这一行被跳过');
<<cod1>>
dbms_output.put_line('被执行');
END;
(2)条件结构
❶IF:
IF .. THEN
执行的代码。。。
ELSIF .. THEN
执行的代码。。。
ELSE
执行的代码。。。
END IF;
❷CASE(类似于Java中的switch):
CASE 变量
WHREN 对应的值 THEN
执行的代码。。。
WHREN 对应的值 THEN
执行的代码。。。、
ELSE
其他。。。。
END CASE;
(3)循环结构
❶loop ... end loop
❷while 表达式 loop ... end loop;
❸for 变量名 in 数字..数字 loop ... end loop;
五、预定义异常、自定义异常和嵌套异常
(1)预定义异常
BEGIN
dbms_output.put_line(6/&input); -- 输出6除以输入的数
EXCEPTION -- 定义捕捉异常
WHEN zero_divide THEN -- 当zero_divide异常发生的时候
dbms_output.put_line('异常发生了,除数不能为零'); -- 打印输出
END;
(2)自定义异常
DECLARE
myExcp EXCEPTION; -- 定义一个异常
sname VARCHAR(20);
BEGIN
sname := '&请输入名字';
IF sname = '西门庆' THEN -- 如果sname的值等于西门庆
RAISE myExcp; -- 抛出异常
END IF; -- 结束IF
dbms_output.put_line(sname);
EXCEPTION -- 捕捉异常
WHEN myExcp THEN -- 当myExcp异常发生的时候
dbms_output.put_line('西门庆是个BUG'); -- 打印输出
END;
(3)嵌套异常
DECLARE
eno NUMBER;
ename emp.ename%TYPE;
BEGIN
eno := &input;
-- dbms_output.put_line(6/&input); -- 输出6除以输入的数
SELECT emp.ename INTO ename FROM emp WHERE empno = eno;
dbms_output.put_line(ename);
EXCEPTION -- 定义捕捉异常
WHEN zero_divide THEN -- 当zero_divide异常发生的时候
dbms_output.put_line('异常发生了,除数不能为零'); -- 打印输出
WHEN no_data_found THEN ---- 当no_data_found异常发生的时候
dbms_output.put_line('找不到数据');
WHEN OTHERS THEN -- others 概括了所有的预定义异常
dbms_output.put_line('error');
END;
六、动态执行(execute immediate)
(1)动态执行可执行里面的字符
BEGIN
EXECUTE IMMEDIATE
'CREATE TABLE test2(n NUMBER)'; -- 字符
END;
浙公网安备 33010602011771号