Oracle_PL-SQL_10

Oracle_PL-SQL_10

PL-SQL: ProcedureLanguage

PL中的主要内容

java source、directory、procedure、function、package、trigger、view

1.   块结构
DECLARE
/*
*定义部分(定义变量、常量、复杂数据类型、游标)
*/
BEGIN
/*
执行部分(pl/sql语句)
*/
excetpion WHENOTHERSTHEN
/*
异常处理部分(处理运行错误)
*/
END;
在PL SQL 中,在test window里面可以对PL-SQL进行调试、查看结果等操作

注意点:

DECLARE
BEGIN
dbms_output.put_line(2 ** 3);
dbms_output.put_line(””);
END;
输出

8

2.  变量和类型
PL-SQL中declare段申明的变量只能在内部使用。

PL-SQL中的类型和SQL中的类似,具体可以查看网上相关文档,这里不再赘述。

注意点:在PL中可以通过%TYPE关键字来定义变量的类型

Student_namestudens.username%TYPE;

3.  条件逻辑
在PL-SQL中,IF、THEN、ELSE、ELSIF和ENDIF等关键字是用于执行条件逻辑的。

例子:

DECLARE
counter INTEGER := 3;
BEGIN
IF counter = 1THEN
dbms_output.put_line(‘嘻嘻’);
ELSIF counter = 2THEN
dbms_output.put_line(‘哈哈’);
ELSE
dbms_output.put_line(‘呵呵’);
ENDIF;
END;
CASE WHEN THEN
DECLARE
os INTEGER := 10;
BEGIN
CASE
WHEN os = 10THEN
dbms_output.put_line(‘XP’);
WHEN os = 20THEN
dbms_output.put_line(‘LINUX’);
ENDCASE;
END;
4.  循环
简单循环
要结束简单循环,可以使用EXIT或EXIT WHEN语句。EXIT立即结束,EXIT WHEN语句在指定条件出现时,结束循环。

DECLARE
counter INTEGER := 0;
BEGIN
LOOP
counter := counter + 1;
–当WHEN条件成立的时候,跳出循环
EXITWHEN counter = 5;
ENDLOOP;
dbms_output.put_line(counter);
END;
WHILE循环
DECLARE
counter INTEGER := 5;
BEGIN
–当WHILE条件不满足时,跳出循环
WHILE counter > 0LOOP
counter := counter – 1;
ENDLOOP;
dbms_output.put_line(counter);
END;
FOR循环
DECLARE
BEGIN
FOR num INREVERSE1 .. 5LOOP
dbms_output.put_line(num);
ENDLOOP;
END;
GOTO语句(NOT RECOMENDED)
PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:

GOTO label;
……
<<label>> /*标号是用<< >>括起来的标识符 */
注意,在以下地方使用是不合法的,编译时会出错误。

(1)跳转到非执行语句前面。

(2) 跳转到子块中。

(3) 跳转到循环语句中。

(4)跳转到条件语句中。

(5) 从异常处理部分跳转到执行。

(6)从条件语句的一部分跳转到另一部分

NULL语句
在PL/SQL 程序中,NULL语句是一个可执行语句,可以用 null 语句来说明“不用做任何事情”的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:

DECLARE

BEGIN

IF v_num IS NULL THEN
GOTO labelPrint;
END IF;

<<labelPrint>>
NULL; –不需要处理任何数据。
END;

DECLARE
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
v_salary employees.salary%TYPE;
v_sal_raise NUMBER(3,2);
BEGIN
v_emp_id := &emp_id;
SELECT first_name, salary INTO v_first_name, v_salary
FROM employees WHERE employee_id = v_emp_id;
IF v_salary <= 3000 THEN
v_sal_raise := .10;
DBMS_OUTPUT.PUT_LINE(v_first_name||’的工资是’||v_salary
||’、工资涨幅是’||v_sal_raise);
ELSE
–使用NULL语句,增加程序的可读性,告诉程序员,IF ELSE外的业务逻辑。
NULL;
END IF;
END;

看一个例子,分别用3中循环,求1+2+3。。。100的和。
–普通循环
/*DECLARE
i INTEGER := 1;
summation INTEGER:= 0;
BEGIN
LOOP
summation :=summation + i;
i := i + 1;
EXIT WHEN i> 100;
END LOOP;
dbms_output.put_line(summation);
END;*/
–WHILE循环
/*DECLARE
i INTEGER := 1;
summation INTEGER:= 0;
BEGIN
WHILE i < 101LOOP
summation :=summation + i;
i := i + 1;
END LOOP;
dbms_output.put_line(summation);
END;*/
–FOR循环
/*DECLARE
summation INTEGER:= 0;
BEGIN
FOR i IN 1 .. 100LOOP
summation :=summation + i;
END LOOP;
dbms_output.put_line(summation);
END;*/
5.      游标
DECLARE
–申明变量
vename emp.ename%TYPE;
vsal emp.sal%TYPE;
–申明游标
CURSOR cur_emp IS
SELECT ename, sal FROM emp;
BEGIN
–打开游标
OPEN cur_emp;
LOOP
–遍历提取
FETCH cur_emp
INTO vename, vsal;
EXITWHEN cur_emp%NOTFOUND;
dbms_output.put_line(‘vEname=’ || vename || ‘,vSal=’ || vsal);
ENDLOOP;
— 关闭游标
CLOSE cur_emp;
END;
简化写法(利用FOR IN 语句)

DECLARE
CURSOR cur_ename IS
SELECT ename FROM emp;
BEGIN
FOR cur_person IN cur_ename LOOP
dbms_output.put_line(cur_person.ename);
ENDLOOP;
END;
DECLARE
CURSOR cur_ename IS
SELECT ename FROM emp;
BEGIN
FOR cur_person IN cur_ename LOOP
dbms_output.put_line(cur_person.ename);
ENDLOOP;
END;