350 likes | 488 Views
第十一章 PL/SQL 程序设计基础. 11.1 PL/SQL 程序概述. PL/SQL 是 Procedure Language & Structured Query Language 的缩写。 Oracle 的 SQL 是支持 ANSI(American national Standards Institute) 和 ISO92(International Standards Organization) 标准的产品。 PL/SQL 是对 SQL 语言存储过程语言的扩展。从 Oracle6 以后, Oracle 的 RDBMS 附带了 PL/SQL 。
E N D
第十一章 PL/SQL 程序设计基础 辽宁工程技术大学 软件工程系
11.1 PL/SQL程序概述 • PL/SQL是 Procedure Language & Structured Query Language 的缩写。 • Oracle的SQL是支持ANSI(American national Standards Institute)和ISO92(International Standards Organization)标准的产品。 • PL/SQL是对SQL语言存储过程语言的扩展。从Oracle6以后,Oracle的RDBMS附带了PL/SQL。 • 它现在已经成为一种过程处理语言,简称PL/SQL(发音:pea ell sequel)。 辽宁工程技术大学 软件工程系
11.1 PL/SQL程序概述 • PL/SQL是Oracle系统的核心语言,现在Oracle的许多部件都是由PL/SQL写成。在PL/SQL中可以使用的SQL语句有: • INSERT • UPDATE • DELETE • SELECT INTO • COMMIT • ROLLBACK • SAVEPOINT 辽宁工程技术大学 软件工程系
11.1 PL/SQL程序概述 • 提示: • 在 PL/SQL中只能用 SQL语句中的 DML 部分,不能用 DDL 部分,如果要在PL/SQL中使用DDL(如Create table 等)的话,只能以动态的方式来使用。 • 在 PL/SQL中只能用 SQL语句中的SELECT 部分,但是,要加上INTO子句,而且结果要唯一,否则,要使用游标。 辽宁工程技术大学 软件工程系
11.2 PL/SQL块结构 • PL/SQL程序由三个块组成,即 声明部分、执行部分、异常处理部分。PL/SQL块的结构如下: • Declare /* 声明部分: 在此 声明PL/SQL用到的变量,类型及光标 */ • begin /* 执行部分: 过程及SQL 语句 , 即程序的主要部分 */ • Exception /* 执行异常部分: 错误处理 */ • End; • 其中 执行部分是必须的 辽宁工程技术大学 软件工程系
11.1 PL/SQL程序概述 • 块可以分为四类: • 无名块:动态构造,只能执行一次。 • 命名块:加了标号的块。 • 子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们。 • 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。 辽宁工程技术大学 软件工程系
11.3 标识符 • 标识符名不能超过30字符; • 第一个字符必须为字母; • 不分大小写; • 不能用’-‘(减号); • 不能是SQL保留字。 辽宁工程技术大学 软件工程系
11.3 标识符 • 不合法的标识符: • declare • v-name varchar2(20); /* 存放name 列的值 */ • 2001_sal number(9,2); /* 存放 sal 列的值 */ • mine&yours number; -- 非法的标识符 • debit-amount number(10,4) ; -- 非法的标识符 • on/off char(1); -- 非法的标识符 • user id varchar2(20); -- 非法的标识符(不能用空格) • 提示: 一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果。 辽宁工程技术大学 软件工程系
11.3 标识符 表11-1 建议的表示符命名方法 辽宁工程技术大学 软件工程系
11.4 PL/SQL 变量类型 辽宁工程技术大学 软件工程系
11.4 PL/SQL 变量类型 • 使用%ROWTYPE • PL/SQL 可以声明与数据库行有相同类型的记录。 • 例: --节选自在线tabrec.sql DECLARE TYPE t_studenttable is TABLE OF students%ROWTYPE /* v_students 的每一元素是一个记录 */ v_students t_studentstable; Begin /* 将结果存到数组变量中 */ select * into v_students(10001) from students where id=10001; end; 辽宁工程技术大学 软件工程系
11.4 PL/SQL 变量类型 • LOB类型 • Oracle提供了LOB (Large OBject)类型,用于存储大的数据对象的类型。Oracle目前主要支持BFILE, BLOB, CLOB 及 NCLOB 类型。 • BFILE • 存放大的二进制数据对象,这些数据文件不放在数据库里,而是放在操作系统的某个目录里,数据库的表里只存放文件的目录。 • BLOB • 存储大的二进制数据类型。每个变量存储大的二进制对象的位置。大二进制的大小<=4GB。 • CLOB • 存储大的字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符的大小<=4GB。 • NCLOB • 存储大的NCHAR字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符的大小<=4GB。 辽宁工程技术大学 软件工程系
11.5 运算符 辽宁工程技术大学 软件工程系
11.6 变量赋值 • 在PL/SQL编程中,变量赋值是一个值得注意的地方,它的语法如下: variable := expression ; 辽宁工程技术大学 软件工程系
11.6 变量赋值 • 字符及数字运算特点 1、空值加数字仍是空值 null + < 数字> = null 2、空值加(连接)字符,结果为字符 null || <字符串> = < 字符串> 3、布尔值不仅有TRUE, FALSE,还有NULL,共三个值 辽宁工程技术大学 软件工程系
11.6 变量赋值 • 例如: DECLARE done BOOLEAN; the following statements are legal: BEGIN done := FALSE; WHILE NOT done LOOP ... END LOOP; 辽宁工程技术大学 软件工程系
11.6 变量赋值 • 数据库数据的赋值 数据库赋值是通过 select 语句来完成的。每执行select 语句一次只能赋值一次。一般要求被赋值的变量与select 中的列名要一一对应。 辽宁工程技术大学 软件工程系
11.6 变量赋值 • 示例: DECLARE emp_id emp.empno%TYPE; emp_name emp.ename%TYPE; wages NUMBER(7,2); BEGIN ... SELECT ename, sal + comm INTO emp_name, wages FROM emp WHERE empno = emp_id; ... END; 辽宁工程技术大学 软件工程系
11.7 条件语句 IF <布尔表达式> THEN PL/SQL 和 SQL语句 ELSIF < 其它布尔表达式> THEN 其它语句 END IF; 辽宁工程技术大学 软件工程系
11.8 循环 • 象其它高级语言一样,PL/SQL的循环结构也有当型循环和直到型循环两种基本形式,它的结构主要有三种,即:LOOP 循环、WHILE循环、FOR循环。 • 1. 简单循环 LOOP 要执行的语句; END LOOP; 辽宁工程技术大学 软件工程系
11.8 循环 辽宁工程技术大学 软件工程系
11.8 循环 • 2. WHILE 循环 While <布尔表达式> LOOP 要执行的语句; END LOOP; 辽宁工程技术大学 软件工程系
11.8 循环 • FOR 循环 FOR 循环计数器 in 下限 .. 上限 LOOP 要执行的语句; END LOOP; 辽宁工程技术大学 软件工程系
11.9 注释 • 在PL/SQL里,可以使用两种符号来写注释,即: • 使用双 ‘-‘ ( 减号) 加注释 如: V_Sal number(12,2); -- 工资变量。 • 使用 /* */ 来加一行或多行注释 如: /***********************************************/ /* 文件名:stattistcs_sal.sql */ /* 功能:统计整个部门工资 */ /* 作者: 王哲元 */ /* 修改日期 :2001.07.03 */ /***********************************************/ 辽宁工程技术大学 软件工程系
11.10 DBMS_OUTPUT的使用 • PL/SQL本身没有提供任何输入功能,但 PL/SQL 2.0 以后的版本提供了内装包DBMS_OUTPUT输出功能 • DBMS_OUTPUT包属于 sys 帐户,但在创建时已将EXECUTE 权授予 PUBLIC,所以任何用户都可以直接使用而不加sys模式。 辽宁工程技术大学 软件工程系
11.10 DBMS_OUTPUT的使用 v_NumLines := 3; DBMS_OUTPUT.GET_LINES. DBMS_OUTPUT.GET_LINES(v_Data, v_NumLines); FOR v_Counter IN 1..v_NumLines LOOP INSERT INTO temp_table (char_col) VALUES (v_Data(v_Counter)); --DBMS_OUTPUT.PUT_LINE(v_data); END LOOP; END; / DECLARE /* Demonstrates using PUT_LINE and GET_LINE. */ v_Data DBMS_OUTPUT.CHARARR; v_NumLines NUMBER; BEGIN DBMS_OUTPUT.ENABLE(1000000); DBMS_OUTPUT.PUT_LINE('Line One'); DBMS_OUTPUT.PUT_LINE('Line Two'); DBMS_OUTPUT.PUT_LINE('Line Three'); 辽宁工程技术大学 软件工程系