(6)Oracle——————PL/SQL的基本语法,记录类型和流程控制语句

1,PL/SQL的基本语法

2,记录类型

3,流程控制语句

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/SQLSQL 语句;
END IF;
IF <布尔表达式> THEN
PL/SQLSQL 语句;
ELSE
其它语句;
END IF;
IF <布尔表达式> THEN
PL/SQLSQL 语句;
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’
ELSENo 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 ;

下一章,(7)Oracle——————游标的使用,异常错误处理,存储过程和触发器

发布了74 篇原创文章 · 获赞 21 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41530004/article/details/104978810