PL/SQL的基本语法
1,什么是 PL/SQL?
- PL/SQL 是 Procedure Language & Structured Query Language 的缩写PL/SQL是对 SQL 语言存储过程语言的扩展,它现在已经成为一种过程处理语言
- PL/SQL 是 是 ORACLE 系统的核心语言,现在 ORACLE 的许多部件都是由 PL/SQL 写成。在 PL/SQL 中可以使用的 SQL 语句有:
INSERT,UPDATE,DELETE,SELECT … INTO,COMMIT,ROLLBACK,SAVEPOINT。 - 提示:在 PL/SQL 中只能用 SQL 语句中的 DML 部分,不能用 DDL 部分,如果要在 PL/SQL 中使用 DDL( 如CREATE table 等 ) 的话,只能以动态的方式来使用。
2,PL/SQL 块结构和组成元素
- PL/SQL 程序由三个块组成,即声明部分、执行部分、异常处理部分
- PL/SQL 块的结构如下:
DECLARE
/* 声明部分 : 在此声明 PL/SQL 用到的变量 , 类型及游标,以及局部的存储过程和函数 */
BEGIN
/* 执行部分 : 过程及 SQL 语句 , 即程序的主要部分 */
EXCEPTION
/* 执行异常部分 : 错误处理 */
END;
-
PL/SQL 块可以分为三类 :
①, 无名块:动态构造,只能执行一次。
②,子程序:存储在数据库中的 存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们。
③,触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。 -
建议的命名方法:
记录类型
- 记录类型是把 逻辑相关 的数据作为一个单元存储起来 ,称作 PL/SQL RECORD 的域(FIELD) ,其作用是存放互不相同但逻辑相关的信息。
- DBMS_OUTPUT.PUT_LINE 过程的功能类似于 Java 中的 System.out.println() 直接将输出结果送到标准输出中
1,使用%TYPE
- 定义一个变量,其数据类型与已经定义的某个 数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE。
- 使用%TYPE 特性的优点在于:
所引用的数据库列的数据类型可以不必知道;
所引用的数据库列的数据类型可以实时改变。
2,使用%ROWTYPE
- PL/SQL 提供%ROWTYPE 操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致。
- 使用%ROWTYPE 特性的优点在于:
所引用的数据库中列的个数和数据类型可以不必知道;
所引用的数据库中列的个数和数据类型可以实时改变。
3,PL/SQL 表( 嵌套表)
- PL/SQL 程序可使用嵌套表类型创建具有一个或多个列和无限行的变量, 这很像数据库中的表. 声明嵌套表类型的一般语法如下:
TYPE type_name IS TABLE OF
{datatype | {variable | table.column} % type | table%rowtype};
- 说明:
①,在使用嵌套表之前必须先使用该集合的构造器初始化它. PL/SQL 自动提供一个带有相同名字的构造器作为集合类型.
②, 嵌套表可以有任意数量的行. 表的大小在必要时可动态地增加或减少: extend(x) 方法添加 x 个空元素到集合末尾; trim(x) 方法为去掉集合末尾的 x 个元素.
4,赋值
- 在 PL/SQL 编程中,变量赋值是一个值得注意的地方,它的语法如下:
variable := expression ;
variable 是一个 PL/SQL 变量, expression 是一个 PL/SQL 表达式.
- 数据库赋值
数据库赋值是 通过 SELECT 语句来完成的,每次执行 SELECT语句就赋值一次, 一般要求被赋值的变量与SELECT 中的列名要一一对应。如
DECLARE
emp_id emp.empno%TYPE :=7788;
emp_name emp.ename%TYPE;
wages emp.sal%TYPE;
BEGIN
SELECT ename, NVL(sal,0) + NVL(comm,0) INTO emp_name, wages
FROM emp WHERE empno = emp_id;
DBMS_OUTPUT.PUT_LINE(emp_name||’----‘||to_char(wages));
END;
PL/SQL 流程控制语句
- PL/SQL 的流程控制语句, 包括如下三类:
控制语句: IF 语句
循环语句: LOOP 语句, EXIT 语句
顺序语句: GOTO 语句, NULL 语句
1,条件语句
IF <布尔表达式> THEN
PL/SQL 和 SQL 语句;
END IF;
IF <布尔表达式> THEN
PL/SQL 和 SQL 语句;
ELSE
其它语句;
END IF;
IF <布尔表达式> THEN
PL/SQL 和 SQL 语句;
ELSIF < 其它布尔表达式> THEN
其它语句;
ELSIF < 其它布尔表达式> THEN
其它语句;
ELSE
其它语句;
END IF;
DECLARE
v_empno emp.empno%TYPE;
V_salary emp.sal%TYPE;
V_comment VARCHAR2(35);
BEGIN
SELECT sal INTO v_salary FROM emp WHERE empno=v_empno;
IF v_salary<1500 THEN
V_comment:= ‘Fairly less’;
ELSIF v_salary <3000 THEN
V_comment:= ‘A little more’;
ELSE
V_comment:= ‘Lots of salary’;
END IF;
DBMS_OUTPUT.PUT_LINE(V_comment);
END;
2,CASE表达式
DECLARE
V_grade char(1) ;
V_appraisal VARCHAR2(20);
BEGIN
V_appraisal :=
CASE v_grade
WHEN ‘A’ THEN ‘Excellent’
WHEN ‘B’ THEN ‘Very Good’
WHEN ‘C’ THEN ‘Good’
ELSE ‘No such grade’
END;
DBMS_OUTPUT.PUT_LINE(‘Grade:‘||v_grade||’ Appraisal: ‘|| v_appraisal);
END;
3,循环
- 简单循环LOOP
DECLARE
int NUMBER(2) :=0;
BEGIN
LOOP
int := int + 1;
DBMS_OUTPUT.PUT_LINE('int 的当前值为:'||int);
EXIT WHEN int =10;
END LOOP;
END;
- WHILE 循环( 相较 LOOP推荐使用 )
DECLARE
x NUMBER :=1;
BEGIN
WHILE x<=10 LOOP
DBMS_OUTPUT.PUT_LINE('X 的当前值为:'||x);
x:= x+1;
END LOOP;
END;
- 数字式循环(每循环一次,循环变量自动加 1;使用关键字 REVERSE,循环变量自动减 1。跟在 IN REVERSE 后面的数字必须是从小到大的顺序, 而且必须是整数,不能是变量或表达式。可以使用 EXIT 退出循环。)
BEGIN
FOR int in 1..10 LOOP
DBMS_OUTPUT.PUT_LINE('int 的当前值为: '||int);
END LOOP;
END;
- 标号和 GOTO(PL/SQL 中 GOTO 语句是无条件跳转到指定的标号去的意思)
DECLARE
V_counter NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('V_counter 的当前值为:'||V_counter);
V_counter := v_counter + 1;
IF v_counter > 10 THEN
GOTO l_ENDofLOOP;
END IF;
END LOOP;
<<l_ENDofLOOP>>
DBMS_OUTPUT.PUT_LINE('V_counter 的当前值为:'||V_counter);
END ;