06第6章 PL SQL基础
- 格式:ppt
- 大小:725.50 KB
- 文档页数:82
PLSQL循序渐进全面学习教程(全)PL/SQL是用于Oracle数据库的编程语言,它结合了SQL语句的数据操作能力和一般编程语言的逻辑控制能力。
PL/SQL循序渐进的全面学习教程将帮助你逐步学习和掌握PL/SQL的各个方面。
1.简介和基础知识:-PL/SQL的概念和背景-PL/SQL的开发工具和环境-PL/SQL和SQL的关系-PL/SQL的基本语法和数据类型2.变量和常量:-PL/SQL变量的声明和使用-不同类型的变量和数据类型-常量的定义和使用3.控制结构:-IF-THEN语句和IF-THEN-ELSE语句-CASE语句的使用-循环语句(FOR循环、WHILE循环)4.异常处理:-异常的概念和分类-异常处理的方法和语句-自定义异常和错误处理5.子程序和函数:-PL/SQL子程序和函数的概念和用途-创建和调用子程序和函数-参数传递和返回值6.游标和结果集:-游标的概念和使用场景-游标的声明、打开、关闭和绑定-使用游标处理结果集和数据集7.触发器:-触发器的概念和作用-创建和使用触发器-触发器的触发事件和触发时机8.包和包体:-包和包体的定义和特点-创建和使用包和包体-包的封装和共享9.过程和函数:-过程和函数的概念和区别-创建和使用过程和函数-过程和函数的编写和调用10.使用PL/SQL开发应用程序:-使用PL/SQL编写数据库操作代码-使用PL/SQL开发业务逻辑-PL/SQL和其他编程语言的集成以上是PL/SQL循序渐进全面学习教程的大纲,你可以根据自己的学习进度逐步深入学习每个主题。
希望这个教程对你学习和掌握PL/SQL编程语言有所帮助!。
plsql使用技巧PL/SQL(Procedural Language/Structured Query Language)是一种过程性的编程语言,用于Oracle数据库的开发和管理。
它结合了SQL语句和基于编程的语言元素,从而允许开发人员编写复杂的业务逻辑和数据处理程序。
以下是一些PL/SQL使用技巧,可以帮助您更好地利用这个强大的工具。
1. 使用块来组织代码:PL/SQL程序由一个或多个块组成,每个块由BEGIN和END语句包围。
使用块可以将相关的代码段组合在一起,并简化代码的调试和维护。
2. 使用异常处理来处理错误:PL/SQL提供了异常处理机制,可以捕获和处理程序中的错误。
通过使用异常处理,可以使程序更加健壮,并提供更好的用户体验。
3. 使用游标来处理查询结果:游标是一种用于操作查询结果的PL/SQL对象。
通过使用游标,可以对查询结果进行逐行处理,并执行各种操作,如插入、更新或删除。
4. 使用PL/SQL表来处理临时数据:PL/SQL提供了PL/SQL 表,这是一种在内存中存储数据的临时表。
使用PL/SQL表可以大大提高程序的性能,因为它们比数据库表更快。
5. 使用存储过程和函数来封装业务逻辑:存储过程和函数是PL/SQL程序的一种类型,它们允许将一系列SQL语句封装到一个可重用的代码块中。
使用存储过程和函数可以提高代码的可维护性和重用性。
6. 使用触发器来自动执行任务:PL/SQL触发器是与数据库表相关联的一种代码块,当满足特定条件时,会自动执行。
使用触发器可以实现自动化任务,如在插入、更新或删除行时执行某些操作。
7. 使用游程来优化数据处理:游程是一种PL/SQL特性,可以将一组记录作为一个单元处理,而不是逐行处理。
通过使用游程,可以大大提高程序的性能,尤其是当需要处理大量数据时。
8. 使用动态SQL来处理动态查询:PL/SQL提供了动态SQL的能力,这使得可以在运行时构建和执行SQL语句。
plsql用法,操作介绍PL/SQL是Oracle数据库中一种重要的编程语言,它提供了强大的数据处理和数据库操作能力。
本文将向大家介绍PL/SQL的用法和操作。
一、PL/SQL基础PL/SQL是一种过程化的编程语言,它可以在Oracle数据库中执行存储过程、函数、触发器和包等对象。
这些对象可以由用户自定义,并在数据库中存储,以供其他用户调用。
PL/SQL提供了丰富的数据类型、控制结构、函数和过程,使得开发者可以方便地编写复杂的数据库操作程序。
二、PL/SQL语法1. 声明语句:在PL/SQL中,需要先声明变量和常量,常见的声明语句有:变量声明(如:变量类型数据类型;),常量声明(如:CONST 常量名数据类型 = 值)。
2. 条件语句:PL/SQL支持多种条件语句,如IF-THEN-ELSE,CASE表达式等。
3. 循环语句:PL/SQL支持FOR循环、WHILE循环和LOOP循环等。
4. 异常处理:PL/SQL提供了异常处理机制,可以捕获和处理运行时出现的错误。
5. 函数和过程:PL/SQL支持定义函数和过程,可以对数据进行操作并返回结果。
三、PL/SQL操作1. 创建存储过程:可以使用CREATE PROCEDURE语句创建存储过程,指定过程的名称、参数和执行逻辑。
2. 调用存储过程:可以使用CALL语句调用存储过程,并传递参数。
3. 创建函数:可以使用CREATE FUNCTION语句创建函数,指定函数的名称、参数和返回值类型。
4. 调用函数:可以使用直接调用函数的方式或通过存储过程调用函数。
5. 创建触发器:可以使用CREATE TRIGGER语句创建触发器,用于在数据插入、更新或删除时触发特定的操作。
6. 修改和删除对象:可以使用ALTER PROCEDURE、DROP PROCEDURE、DROP FUNCTION等语句修改或删除已存在的PL/SQL对象。
四、示例以下是一个简单的PL/SQL程序示例,用于将输入的字符串转换为大写并输出:```plsqlDECLAREv_str VARCHAR2(100);v_upper VARCHAR2(100);BEGIN-- 获取输入字符串:in_str := 'hello world';v_str := :in_str;-- 将字符串转换为大写并输出v_upper := UPPER(v_str);DBMS_OUTPUT.PUT_LINE('转换后的字符串为: ' || v_upper);END;```在上述示例中,我们使用了DECLARE语句声明了两个变量v_str 和v_upper,分别用于存储输入的字符串和转换后的结果。
一.PL/SQL的基本结构1.一个PL/SQL例子DECLARE--声明一个变量expi rienceqty_on_hand NUMBER(5);BEGIN--从库存中查处网球拍的当前数量并放到变量qty_on_hand中SELECT quantity INTO qty_on_hand FROM inventoryWHERE product = '网球拍';--在库存大于0的情况下IF qty_on_hand > 0 THEN -- check quantity--更新网球拍的在库数量(当前数量减1)UPDATE inventory SET quantity = quantity - 1WHERE product = '网球拍';--在purchase_record这个表中插入一条购买记录INSERT INTO purchase_recordVALUES ('购买网球拍', SYSDATE);ELSE--如果当前库存为0,在purchase_record中插入一条库存不足的记录INSERT INTO purchase_recordVALUES ('网球拍库存不足', SYSDATE);END IF;END;PL/SQL基本上是由select + DML语句(update , insert , delete) + 控制语句(if else , case , loop , etc) 组成一.数据类型:1.NUMBER[(precision,scale)]整数的声明:part_no NUMBER(4);或者 part_no NUMBER(4,0);带小数的number声明:PI NUMBER(3,2) ;整数的赋值:part_no := 9999;PI := 3.14;其他数字类型的类型有PLS_INTEGER,DECIMAL,FLOAT等2.VARCHAR2字符串的声明:V_name VARCHAR2(20);字符串的赋值:V_name := ‘Oracle’;在变量声明时必须指定长度。
PLSQL学习(一) 基础知识很久以前自己整理的PLSQL一些基础知识,翻出来看看都是比较基础的内容,还是放上来好了。
参考的资料是《PL/SQL用户指南与参考》中译版,觉得这是一部很不错的入门书,感谢把这本书翻译出来的网友。
1、乘方的不同应用:在SQL中乘方只能使用函数Power(a,b)来计算但在PLSQL中可直接使用a**b表示2、赋值语句Returning:insert into t1 values(90,'SERVICE','BEIJING')Returning rowid,name into row_id,info;注:只限insert、update、delete一条记录时进行赋值3、自定义参数——&:可SQL和PLSQL中均可使用自定义参数,即需要自己输入值的参数select * from ldcom where comcode=&a andname=&b;PLSQL:declare i int := &a; n int := &b;4、绑定变量的使用:可使用绑定变量的办法提高SQL效率SQL> variable x number ;SQL> exec :x := 8600 ;SQL> select * from ldcom where comcode= :x ;注:PLSQL中的declare即隐士绑定,无需再申明可用Print查看绑定变量 SQL> print x;也可使用查询SQL> select :x from dual;实际的简单应用:variable x number;declarev_date date;beginfor i in1.. 10loop:x := i;select sysdate+:x into v_date from dual;dbms_output.put_line(v_date);end loop;end;/在execute immediate中的应用:declarev_x t1.num%type;beginexecute immediate'update t1 set num=8888 where id=:a returning num into :b'using2returning into v_x;dbms_output.put_line(v_x);end;注意returning的返回值在动态SQL中的操作格式5、%TYPE和%ROWTYPE的区别:%TYPE针对某一字段类型(数组也是单一的类型)%ROWTYPE针对某一整表的类型(游标也是整表)6、计数循环的逆序法:for i in reverse10.. 100loop注意reverse的位置不要记错7、一般的游标使用法:1、游标的正常使用需要四步①定义游标cursor c2(dept_no number default10) is----注意定义dept_no的方法select name,agentcode from laagent where rownum <= dept_no;②打开游标open c3(dept_no =>20); ----可以重新定义dept_no③提取游标数据fetch c2 into dept_name,dept_loc;----字符类型、个数相等fetch c3 into deptrec;----deptrec为rowtypeexit when c3%notfound;④关闭游标CLOSE c3;⑤游标属性%FOUND--布尔型属性,当最近一次读记录时成功返回,则值为TRUE;%NOTFOUND--布尔型属性,与%FOUND相反;%ISOPEN--布尔型属性,当游标已打开时返回TRUE;%ROWCOUNT--数字型属性,返回已从游标中读取的记录数。
plsql使用教程PL/SQL是Oracle数据库的过程式编程语言,它结合了SQL的强大查询能力和程序设计语言的灵活性。
以下是一个简单的PL/SQL使用教程:1. 定义变量在PL/SQL中,可以使用DECLARE语句来定义变量。
例如:DECLAREnum INTEGER;name VARCHAR2(50);2. 使用SELECT查询数据可以使用SELECT语句从表中检索数据。
例如:SELECT * INTO num, name FROM employees WHERE employee_id = 100;3. 使用IF-THEN-ELSE进行条件判断PL/SQL提供了IF-THEN-ELSE语句来进行条件判断。
例如:IF num > 0 THENDBMS_OUTPUT.PUT_LINE('Number is positive');ELSEDBMS_OUTPUT.PUT_LINE('Number is negative');END IF;4. 使用FOR循环可以使用FOR循环来对一个集合进行迭代。
例如:FOR i IN 1..10 LOOPDBMS_OUTPUT.PUT_LINE('The value of i is: ' || i);END LOOP;5. 创建存储过程可以使用CREATE PROCEDURE语句来创建存储过程。
例如:CREATE PROCEDURE get_employee_details (p_employee_idIN NUMBER) ISv_employee_name VARCHAR2(50);BEGINSELECT employee_name INTO v_employee_name FROM employees WHERE employee_id = p_employee_id;DBMS_OUTPUT.PUT_LINE('Employee name is: ' ||v_employee_name);END;6. 调用存储过程可以使用EXECUTE语句来调用存储过程。
初学者必读的SQL数据库基础教程SQL数据库是一种常用的数据库管理系统,广泛应用于各种软件开发和数据管理领域。
对于初学者来说,掌握SQL数据库的基础知识是非常重要的。
本文将从数据定义语言、数据操作语言、数据查询语言和数据控制语言等方面,为初学者提供一份必读的SQL数据库基础教程。
第一章数据定义语言(DDL)数据定义语言(DDL)是SQL数据库中用来定义数据库结构的语言。
它包括创建、修改和删除数据库、表、列以及其他对象的操作。
在SQL中,创建数据库使用CREATE DATABASE语句,创建表使用CREATE TABLE语句,修改表结构使用ALTER TABLE语句,删除表使用DROP TABLE语句等。
初学者在学习时应该了解这些常用的DDL语句,并能够正确地使用它们。
第二章数据操作语言(DML)数据操作语言(DML)是SQL数据库中用来对数据库中的数据进行操作的语言。
它包括插入、更新和删除数据的操作。
在SQL中,插入数据使用INSERT INTO语句,更新数据使用UPDATE语句,删除数据使用DELETE FROM语句等。
初学者需要熟悉这些基本的DML语句,并能够通过它们来操作数据库中的数据。
第三章数据查询语言(DQL)数据查询语言(DQL)是SQL数据库中用来查询数据库中的数据的语言。
它包括SELECT语句和一些用于过滤、排序和聚合数据的函数。
初学者需要掌握SELECT语句的基本用法,了解如何使用WHERE子句进行条件过滤,如何使用ORDER BY子句进行排序,以及如何使用GROUP BY子句进行数据聚合。
第四章数据控制语言(DCL)数据控制语言(DCL)是SQL数据库中用来控制数据库访问权限和事务处理的语言。
它包括GRANT和REVOKE语句用于授权和撤销权限,以及BEGIN TRANSACTION、COMMIT和ROLLBACK语句用于管理事务。
初学者需要了解如何使用DCL语句来管理数据库的安全性和事务一致性。
PL/SQL 是Oracle 数据库中用于存储过程、函数、触发器和包等程序的编程语言。
以下是PL/SQL 使用手册的参考指南:1、连接Oracle 数据库:在开始编写PL/SQL 程序之前,您需要先连接到Oracle 数据库。
可以通过以下步骤连接到数据库:•运行PLSQL,将弹出数据库连接对话框。
•在对话框中选择要连接的Oracle 服务名,并输入用户名和密码。
•点击“OK”按钮进行连接。
2、登录信息保存功能设置:如果设置了登录信息保存功能,可以通过以下方式连接数据库,不必每次输入用户名和密码。
•进入PLSQL 后,在菜单区点击右键,出现PLSQL 配置界面。
•将“Store with password” 选中即可。
这样,第一次通过用户名/密码登录某数据库后,下次就不用再输入用户名/密码了。
3、切换数据库连接:在PLSQL 中,可以通过以下步骤切换到不同的数据库连接:•在菜单中选择“Change Database” 选项。
•在弹出的对话框中,选择要连接的数据库。
•点击“OK” 按钮完成切换。
4、编写PL/SQL 程序:在连接到数据库后,可以开始编写PL/SQL 程序。
以下是一些常见的PL/SQL 程序示例:•存储过程:用于封装复杂的SQL 查询和数据处理逻辑。
可以使用PL/SQL 编写一个或多个SQL 语句的集合,并将其封装在一个可重用的过程中。
•函数:用于计算并返回一个值。
可以编写一个或多个SQL 语句,将其封装在一个函数中,并使用输入参数来控制计算过程。
•触发器:用于在数据库中执行自动操作。
可以在特定的数据库事件(如插入、更新或删除记录)发生时触发自动执行的操作。
•包:用于封装多个PL/SQL 程序和逻辑单元。
可以将相关的存储过程、函数和数据类型封装在一个包中,以便更好地组织和管理代码。
5、执行SQL 语句:在PLSQL 中,可以使用以下步骤执行SQL 语句:•在菜单中选择“Execute” 或“Run” 选项。
plsql 使用手册(最新版)目录1.PL/SQL简介2.PL/SQL的基本语法3.数据类型与变量4.控制结构5.函数与过程6.触发器与存储过程7.异常处理8.PL/SQL与SQL的交互9.PL/SQL的应用实例10.PL/SQL的优缺点及发展前景正文【PL/SQL 简介】PL/SQL(Procedural Language/Structured Query Language)是一种过程式编程语言,它是为了与 SQL(结构化查询语言)协同工作而设计的。
PL/SQL 通常用于 Oracle 数据库中,用于编写存储过程、触发器、函数等,从而实现对数据库的高级操作和控制。
【PL/SQL 的基本语法】PL/SQL的基本语法包括变量声明、数据类型、控制结构(条件语句、循环语句等)、函数与过程、触发器与存储过程等。
【数据类型与变量】PL/SQL的数据类型与SQL的数据类型基本一致,包括数字类型、字符串类型、日期类型等。
在PL/SQL中,需要先声明变量,再进行使用。
【控制结构】PL/SQL的控制结构包括条件语句(IF-THEN、IF-THEN-ELSE)、循环语句(WHILE、FOR)等,用于实现复杂的逻辑控制。
【函数与过程】函数是一种返回某个值的过程,过程则是一种不返回值的操作。
在PL/SQL 中,函数与过程可以通过参数传递数据,并返回结果。
【触发器与存储过程】触发器是一种在对表执行 INSERT、UPDATE 或 DELETE 操作时自动执行的存储过程。
存储过程是一组预先编译的 SQL 语句,可以实现复杂的业务逻辑。
【异常处理】PL/SQL中可以处理异常,通过EXCEPTION和WHEN子句可以捕获和处理异常情况。
【PL/SQL 与 SQL 的交互】PL/SQL可以与SQL进行交互,例如在PL/SQL过程中调用SQL语句,或者在SQL语句中调用PL/SQL过程。
【PL/SQL 的应用实例】一个典型的PL/SQL应用实例是编写一个存储过程,用于实现数据的增、删、改、查等操作。
plsql 使用手册摘要:1.简介- Oracle PL/SQL简介- 为什么使用PL/SQL2.PL/SQL基础- 创建PL/SQL块- 声明变量- 数据类型- 控制结构- IF-ELSE 条件语句- CASE 选择语句- LOOP 循环语句- GOTO 跳转语句- 异常处理3.过程和函数- 创建过程和函数- 参数传递- 返回值- 过程和函数的调用4.游标- 游标的概念和类型- 打开游标- 获取数据- 关闭游标- 游标的更新和删除操作5.存储过程- 存储过程的概念和优点- 创建存储过程- 调用存储过程- 参数传递和返回值6.触发器- 触发器的概念和类型- 创建触发器- 触发器的执行时机- 触发器的应用场景7.包- 包的概念和优点- 创建包- 调用包中的过程和函数- 包的维护8.数据库交互- 连接数据库- 查询数据- 更新数据- 删除数据- 事务处理9.高级主题- 安全性和权限控制- 性能调优- 全球化支持正文:PL/SQL(Procedural Language/Structured Query Language)是一种过程式编程语言,用于Oracle 数据库管理系统。
它允许开发人员编写可重用的组件,如存储过程、触发器和包,从而简化了数据库应用程序的开发和维护。
在本使用手册中,我们将介绍PL/SQL 的基本概念和特性,以及如何使用它来创建高效、可靠的数据库应用程序。
1.简介Oracle PL/SQL是一种强大的编程语言,它允许开发人员在SQL语句中嵌入PL/SQL块,以实现更高级别的功能。
使用PL/SQL可以提高代码的重用性、模块化和安全性,降低应用程序的开发和维护成本。
1.1 为什么使用PL/SQLPL/SQL具有以下优点:- 代码可重用:PL/SQL 允许开发人员创建可重用的存储过程、触发器和包,从而减少代码量,提高开发效率。
- 模块化:PL/SQL 块可以嵌套,使代码结构更清晰,易于理解和维护。
plsql基础知识—定义并使⽤变量n 介绍在编写pl/sql程序是,可以定义变量和常量;在pl/sql程序中包括有:①标量类型(scalar)②复合类型(composite)③参照类型(reference)④lob(large object)标量(scalar)⼀常⽤类型在编写pl/sql块时,如果要使⽤变量,需在定义部分定义变量。
n pl/sql中定义变量和常量的语法如下:identifier [constant] datatype [not null][:=|default expr]identifier:名称constant:指定常量,需要指定它的初始值,且其值是不能改变的datatype:数据类型not null:指定变量值不能为null:= :给变量或是常量指定初始值default:⽤于指定初始值expr:指定初始值的pl/sql表达式,可以是⽂本值、其它变量、函数等n 标量定义的案例①定义⼀个变长字符串v_ename varchar2(10)②定义⼀个⼩数范围-9999.99~9999.99v_sal number(6,2);③定义⼀个⼩数并给⼀个初始值为5.4:=是pl/sql的赋值号v_sal2number(6,2):=5.4④定义⼀个⽇期类型的数据v_hiredate date;⑤定义⼀个布尔变量,不能为空,初始值为falsev_valid boolean:=false;n 标量(scalar)⼀使⽤标量在定义好变量后,就可以使⽤这些变量。
这⾥需要说明的是pl/sql块为变量赋值不同于其它编程语⾔,需要在等号前加冒号(:=)案例:以输⼊⼯号,显⽰雇员姓名、⼯资、个⼈所得税(税率为0.03)为例,说明变量的使⽤,看看如何编写。
create or replace procedure pro1(v_in_empno in number) isv_tax_rate number(3,2):=0.03;v_sal number;v_ename varchar2(32);v_tax number;beginselect ename,sal into v_ename,v_sal from emp where empno=v_in_empno;v_tax:=v_sal*v_tax_rate;dbms_output.put_line(v_ename||'⼯资是 '||v_sal||' 个⼈所得税是 '||v_tax);end;n 标量(scalar)⼀使⽤%type类型对于上⾯的pl/sql块有⼀个问题:就是如果员⼯的姓名超过了5个字符的话,就会有错误,为了降低pl/sql程序的维护⼯作量,可以使⽤%type属性定义变量,这样它会按照数据库列来确定你定义的变量的类型和长度。
PLSQL基础语法有时候我们需要对数据库中的数据进⾏⼀些稍微复杂的操作,⽽且这些操作都是⼀次性的,⽤完之后就不再⽤了。
⽤存储过程的话就太⿇烦,⽽且浪费,⽤完了还要去删除。
⽽单个SQL⽆法满⾜需求。
这时候⽤⼀下SQL的语句块就可以了。
如果你⽤的是Oracle数据库,那么你就可以⽤PL/SQL(Procedure Language/SQL),即过程化查询语⾔。
这是第三代语⾔。
⽽我们⽤的SQL是结构化查询语⾔,属于第四代语⾔。
PL/SQL能够实现更加复杂的逻辑操作,像我们使⽤Java,C等⾼级语⾔⼀样。
但如果是在MYSQL/SQLSERVER数据库中,那PL/SQL 就⽆法使⽤(PL/SQL是属于Oracle的过程查询语⾔)。
如果你要在MYSQL/SQLSERVER实现复杂的逻辑查询,那你只能通过编写存储过程实现。
下⾯对PL/SQL常⽤的⼀些基础知识进⾏讲解。
在讲解之前,先创建⼀个⽤于测试的表:--创建测试表create table t_plsql_test(id varchar(10),name varchar(100),mDate date);--插⼊测试数据insert into t_plsql_test values(1, 'one', to_date('1992/03/08', 'YYYY/MM/DD'));insert into t_plsql_test values(2, 'one', to_date('1993/03/08', 'YYYY/MM/DD'));insert into t_plsql_test values(3, 'one', to_date('1994/03/08', 'YYYY/MM/DD'));commit;--查看select * from t_plsql_test;⼀、PL/SQL的结构[declare] --变量声明(可以省略) --如:my_var varchar(200);begin --SQL语句[exception] --异常声明(可以省略) end;例如:declarenowDate date:= sysdate;BEGINupdate t_plsql_testset mdate = nowDatewhere id = 3;commit;END;--查看select * from t_plsql_test;⼆、PL/SQL的基本规则1、标识符不区分⼤⼩写,所有的名称在存储时⾃动改成⼤写。
PL/SQL程序设计目录第一章PL/SQL 程序设计简介 (4)§1.2SQL与PL/SQL (4)§1.2.1 什么是PL/SQL? (4)§1.2.1 PL/SQL的好处 (4)§1.2.2 PL/SQL 可用的SQL语句 (5)§1.3运行PL/SQL程序 (5)第二章PL/SQL块结构和组成元素 (6)§2.1PL/SQL块 (6)§2.2PL/SQL结构 (6)§2.3标识符 (6)§2.4PL/SQL变量类型 (7)§2.4.1 变量类型 (7)§2.4.2 复合类型 (9)§2.4.3 使用%ROWTYPE (11)§2.4.4 LOB类型* (11)§2.4.5 Bind 变量 (11)§2.4.6 INDEX BY TABLES (12)§2.4.7 数据类型的转换* (13)§2.5运算符和表达式(数据定义) (13)§2.5.1 关系运算符 (13)§2.5.2 一般运算符 (13)§2.5.3 逻辑运算符 (14)§2.6变量赋值 (14)§2.6.1 字符及数字运算特点 (14)§2.6.2 BOOLEAN 赋值 (14)§2.6.3 数据库赋值 (14)§2.6.4 可转换的类型赋值 (15)§2.7变量作用范围及可见性 (15)§2.8注释 (16)§2.9简单例子 (17)§2.9.1 简单数据插入例子 (17)§2.9.2 简单数据删除例子 (17)第三章PL/SQL流程控制语句 (18)§3.1条件语句 (18)§3.2CASE表达式 (19)§3.3循环 (19)§3.3标号和GOTO (21)§3.4NULL语句 (21)第四章游标的使用 (23)§4.1游标概念 (23)§4.1.1 处理显式游标 (23)§4.1.2 处理隐式游标 (26)§4.1.3 游标修改和删除操作 (27)第五章异常错误处理 (29)§5.1异常处理概念 (29)§5.1.1 预定义的异常处理 (29)§5.1.2 非预定义的异常处理 (30)§5.1.3 用户自定义的异常处理 (31)§5.1.4 用户定义的异常处理 (32)§5.2异常错误传播 (33)§5.2.1 在执行部分引发异常错误 (33)§5.2.2 在声明部分引发异常错误 (34)§5.3异常错误处理编程 (34)§5.4在PL/SQL中使用SQLCODE,SQLERRM (35)第六章存储函数和过程 (36)§6.1引言 (36)§6.2创建函数 (36)§6.3存储过程 (39)§6.3.1 创建过程 (39)§6.3.2 调用存储过程 (40)§6.3.3 开发存储过程步骤 (42)§6.3.4 与过程相关数据字典 (43)第七章包的创建和应用 (44)§7.1引言 (44)§7.2包的定义 (44)§7.3包的开发步骤 (45)§7.4包定义的说明 (45)§7.5子程序重载 (48)§7.6删除过程、函数和包 (50)§7.7包的管理 (50)第八章触发器 (51)§8.1触发器类型 (51)§8.1.1 DML触发器 (51)§8.1.2 替代触发器 (51)§8.1.3 系统触发器 (51)§8.2创建触发器 (51)§8.2.1 触发器触发次序 (53)§8.2.2 创建DML触发器 (53)§8.2.3 创建替代(Instead_of)触发器 (54)§8.2.3 创建系统事件触发器 (54)§8.2.4 系统触发器事件属性 (55)§8.2.5 使用触发器谓词 (56)§8.2.6 重新编译触发器 (56)§8.3删除和使能触发器 (56)§8.4触发器和数据字典 (57)§8.5数据库触发器的应用举例 (57)第一章PL/SQL 程序设计简介PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。
6第六讲 PL/SQL基础西南林业大学计算机与信息学院——鲁 宁教学目标•PL/SQL 简介•PL/SQL 功能•变量和常量•PL/SQL 结构•逻辑比较•控制结构•异常简介西南林业大学计算机与信息学院——鲁 宁PL/SQL 简介•SQL 是当今最为强大的数据检索机制之一•SQL 并不能完成一个过程语言所能完成的所有任务•PL/SQL 代表Procedural Language/SQL(Procedural Language:过程语言)•PL/SQL 将SQL 的强大功能和过程语言的灵活性结合在一起•PL/SQL 是SQL 的扩展,是一种包含了过程语句和命令以及SQL 命令的应用程序开发语言•允许使用循环和条件分支等流控制语句来处理数据西南林业大学计算机与信息学院——鲁 宁PL/SQL 功能•消除了数据库技术和过程编程语言之间的障碍•植根于SQL,扩展了标准的SQL 数据库语言•使用控制、循环和分支等过程技术•支持游标操作、异常、函数和事务命令的SQL•支持变量和常量、强大的错误处理、函数、对象类型和集合•减少了客户机/服务器环境中的网络流量•减少了应用程序与RDBMS 之间的通信•可移植性好,灵活、强大、简单易学西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁PL/SQL 的体系结构SQL 语句执行器主程序或ORACLE 工具匿名 PL/SQL 块匿名PL/SQL 块过程语句执行器ORACLE 服务器PL/SQL 引擎过程语句SQL 语句PL/SQL 结构•一个标准PL/SQL 代码段称作程序块•一个程序块是由三个部分或节构成的–定义部分–表示程序块声明部分的开始–声明对于程序块而言是局部的–执行部分–异常处理部分西南林业大学计算机与信息学院——鲁 宁PL/SQL 结构DECLARE/**定义部分(可选)——定义常量、变量、复杂数据类型、游标、例解*/BEGIN/*PL/SQL语句和SQL语句*执行部分(必须)————PL/SQL*/EXCEPTION/**异常处理部分(可选)——处理运行错误*/END; / /**块结束标记*/西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁一个简单的PL/SQL 块•set set serveroutput serveroutput serveroutput on on •begin •dbms_output.put_line('Hello,World dbms_output.put_line('Hello,World dbms_output.put_line('Hello,World!');!');•end;•/•/*可以用任何编辑器编写 PL/SQL 程序,并将其保存为具有 .sql sql 扩展名的文件•使用 “@ <filename>”命令执行PL/SQL 程序文件*/PL/SQL 块分类•匿名块•命名块•子程序–过程–函数•包•触发器西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁匿名块•匿名块:没有名称的PL/SQL 块•示例:begindbms_output.put_line('Hello,World dbms_output.put_line('Hello,World dbms_output.put_line('Hello,World!');!'); begindbms_output.put_line('Good dbms_output.put_line('Good dbms_output.put_line('Good');'); end;end;/西南林业大学计算机与信息学院——鲁 宁命名块•命名块:指具有特定名称标识的PL/SQL 块,在PL/SQL 块前使用<<>>加以标记•目的:使多级嵌套层次清楚•示例:<<outer>>begindbms_output.put_line('Hello,World dbms_output.put_line('Hello,World dbms_output.put_line('Hello,World!');!'); <<inner>>begindbms_output.put_line('Good dbms_output.put_line('Good dbms_output.put_line('Good');'); end; --<<inner>>end;--<<outer>>/PL/SQL变量•变量:数据的临时存储–在声明部分中声明–可以在 SQL 语句和过程语句中使用–在可执行部分中赋予新值•使用变量的优点–可重用性–易于维护•PL/SQL变量用于SQL 或PL/SQL语句中表达式的任何位置•PL/SQL变量必须先声明,再引用西南林业大学计算机与信息学院——鲁 宁定义变量•语法–变量名数据类型•注:数据类型为任何Oracle 内部数据类型•示例NUMBER(5,2);StudScoreStudScore NUMBER(5,2);VARCHAR(20);StudName VARCHAR(20);StudNameBOOLEAN; --是否团员StudMemberStudMember BOOLEAN; --西南林业大学计算机与信息学院——鲁 宁PL/SQL常量•除了必须添加关键字CONSTANT 并赋值外,常量的声明方式与变量非常相似•示例PI CONSTANT NUMBER(8,7):=3.1415926;西南林业大学计算机与信息学院——鲁 宁使用属性声明•PL/SQL 对象(如变量和常量)和数据库对象(如列和表)与某些属性关联•属性–引用数据库中的数据类型和对象–PL/SQL 变量和常量可以具有属性•属性的类型–%TYPE——引用数据库列%TYPE——–%ROWTYPE——代表表中的行%ROWTYPE——•使用属性声明可以用于简化变量和常量声明西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁%TYPE 属性•提供变量或列的数据类型 •在对引用到数据库中的列的变量进行声明时有用 –需要知道列的确切数据类型–如果列定义发生变化,则变量的数据类型在运行时也将随之更改•示例SName SName StudInfo.StudName%Type StudInfo.StudName%Type StudInfo.StudName%Type;;NewName NewName SName%TYPESName%TYPE ;%ROWTYPE属性•当记录变量具有与表或视图中的行或从游标获取的行相同的结构时有用•记录中的字段具有与表/视图中的列相同的名称和数据类型•示例Stud_RecStudInfo%ROWTYPE;;Stud_Rec StudInfo%ROWTYPE•可以使用下列属性引用特定字段Stud_Rec.StudNameStud_Rec.StudName;;西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁使用赋值操作符进行赋值 •赋值操作符“:=:=””•赋值语句:变量名:=值•值可以是数据量、变量、算术操作符或 PL/SQL 函数调用的表达式•示例declareSName SName SName StudInfo.StudName%Type StudInfo.StudName%Type;; StudScore StudScore StudScore Number(5,2);Number(5,2);beginSName SName SName:=':='李明'; StudScore StudScore StudScore:=:=:=Length('ABC Length('ABC Length('ABC')')')**3;end;/西南林业大学计算机与信息学院——鲁 宁使用 SELECT INTO 进行赋值 •语法SELECT <列名> INTO <变量名>FROM <表名> WHERE <条件>;•示例declareSName SName SName StudInfo.StudName%Type StudInfo.StudName%Type;; beginSELECT SELECT StudName StudName StudName INTO INTO INTO SNameSName FROM FROM StudInfo StudInfo StudInfo WHERE WHERE WHERE StudNo StudNo StudNo='20010505001';='20010505001'; dbms_output.put_line(SName dbms_output.put_line(SName dbms_output.put_line(SName);); end;使用SELECT INTO 进行赋值(续)•SELECT 语句执行后,将出现下列情况之一–只检索了一行–检索了多行–不检索任何行•仅当它检索一行时,SELECT 才成功操作•其他两种情况将导致错误并产生异常处理程序西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁接受用户输入的值•使用“&”操作符及赋值操作符可以接受用户输入的值 •示例declareSName SName SName varchar2(20);varchar2(20); SScore SScore SScore Number(5,1);Number(5,1); beginSName SName SName:='&:='&:='&StudName StudName StudName';'; SScore SScore SScore:=&:=&:=&StudScore StudScore StudScore;; end;•注:“StudName ”是绑定变量,不应该声明,但是需要声明 SName条件控制•选择结构测试某个条件,然后根据条件在两序列语句中选择一列执行•有三种语句形式–IF-THEN–IF-THEN-ELSE–IF-THEN-ELSIF西南林业大学计算机与信息学院——鲁 宁IF-THEN 结构•仅当条件值为TRUE 时,才执行语句序列•如果条件判定为FALSE 或NULL,则不执行任何操作•语法IF <条件> THEN语句;END IF;西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁IF-THEN 示例declarei i int int int;;begini:=5;if i=5 then dbms_output.put_line(i+5);end if;end;/IF-THEN-ELSE 结构•仅当条件值为FALSE 或NULL 时,才执行ELSE 子句中的语句序列IF <条件> THEN语句;ELSE语句;END IF;西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁IF-THEN-ELSE 示例declarei i int int int;;begini:=5;if i<5 thendbms_output.put_line('i dbms_output.put_line('i dbms_output.put_line('i<5');<5'); elsedbms_output.put_line('i dbms_output.put_line('i dbms_output.put_line('i>=5');>=5'); end if;end;IF-THEN-ELSIF 结构IF <条件1> THEN语句;ELSIF <条件2> THEN语句;ELSIF <条件3> THEN语句;ELSE语句;END IF;西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁IF-THEN-ELSIF 示例 declarei i int int int;; begini:=5;if i<5 thendbms_output.put_line('i dbms_output.put_line('i dbms_output.put_line('i<5');<5'); elsif elsif elsif i=5 theni=5 then dbms_output.put_line('i dbms_output.put_line('i dbms_output.put_line('i=5');=5'); elsedbms_output.put_line('i dbms_output.put_line('i dbms_output.put_line('i>5');>5'); end if;end;CASE语句单一选择等值比较CASE <变量>WHEN <值1> THEN语句;WHEN <值2> THEN语句;……WHEN <值N> THEN语句;[Else]语句;End Case;西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁CASE 语句单一选择等值比较示例declareN N int int int ;;beginN:=&N;Case NWhen 1 Thendbms_output.put_line('N dbms_output.put_line('N dbms_output.put_line('N=1');=1'); When 2 thendbms_output.put_line('N dbms_output.put_line('N dbms_output.put_line('N=2');=2'); When 3 thendbms_output.put_line('N dbms_output.put_line('N dbms_output.put_line('N=3');=3'); elsedbms_output.put_line('N dbms_output.put_line('N dbms_output.put_line('N='||='||='||TO_Char(N TO_Char(N TO_Char(N));)); end Case;end;CASE语句多条件比较CASEWHEN <逻辑表达式1> THEN语句;WHEN <逻辑表达式2> THEN语句;……WHEN <逻辑表达式N> THEN语句;[Else]语句;End Case;西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁CASE 语句多条件比较示例declareN N int int int;;beginN:=&N;CaseWhen N<5 Thendbms_output.put_line('N dbms_output.put_line('N dbms_output.put_line('N<5');<5'); When N>5 Thendbms_output.put_line('N dbms_output.put_line('N dbms_output.put_line('N>5');>5'); elsedbms_output.put_line('N dbms_output.put_line('N dbms_output.put_line('N=5');=5'); end Case;end;循环控制•使用LOOP 或GOTO 语句可以重复或跳过程序块的选取部分•有三种形式的LOOP 语句–LOOP–WHILE-LOOP–FOR-LOOP西南林业大学计算机与信息学院——鲁 宁LOOP 语句•语法LOOP语句;[EXIT][EXIT-WHEN]END LOOP;•被重复的语句位于关键词 LOOPLOOP 和END LOOP 之间•每执行一次循环迭代过程,就执行一次语句序列,然后控制又回到循环的开始位置西南林业大学计算机与信息学院——鲁 宁EXIT 语句•如果不需要或不可能让循环进一步处理,用于完成循环•有两种形式的EXIT 语句–EXIT–EXIT-WHEN西南林业大学计算机与信息学院——鲁 宁EXIT 语句(续)•强制循环无条件完成•必须放在循环内LOOP语句;IF <条件> THENEXIT; --立即退出循环END IF;END LOOP;--控制到此处恢复西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁计算S=1+3+5+S=1+3+5+……+99 declarei i int int int:=1;:=1; S S int int int:=0;:=0; beginloopS:= S:=S+i S+i S+i;; i:=i+2;if i>99 thenexit;end if;end loop;dbms_output.put_line(s dbms_output.put_line(s dbms_output.put_line(s);); end;EXIT-WHEN 语句•允许循环有条件完成•在遇到EXIT 语句时对WHEN 子句中的条件进行判断•如果判定条件为TRUE,则循环完成LOOPLOOP语句;EXIT WHEN <条件>;END LOOP;西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁计算S=5!declarei i int int int:=1;:=1; S S int int int:=1;:=1;beginloopS:=S S:=S**i; i:=i+1;exit when i>5;end loop;dbms_output.put_line('5!='|| dbms_output.put_line('5!='||to_char(s to_char(s to_char(s));));end;WHILE-LOOP 语句•语法WHILE <条件>LOOP语句;END LOOP;•将条件与LOOP-END LOOP 中的语句序列相关联•循环执行的次数取决于条件且只有完成循环后才可知西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁WHILE-LOOP 示例:计算N!declarei i int int int:=1;:=1; N N int int int;; k number:=1;beginN:=&N;While i<=Nloopk:=k k:=k**i; i:=i+1;end loop;dbms_output.put_line('5!='|| dbms_output.put_line('5!='||to_char(k to_char(k to_char(k));));end;西南林业大学计算机与信息学院——鲁 宁FOR-LOOP 语句•语法FOR <计数器> IN [Reverse] > IN [Reverse] lower_bound lower_bound lower_bound .. .. .. higher_bound higher_bound higher_boundLOOP语句;END LOOP;•循环在指定的整数范围内进行 •不能为循环计数器赋值 •在运行时可以动态分配循环范围 •对于一定范围内的每个整数,都执行一次该语句•每执行一次循环,循环计数器就会增加西南林业大学计算机与信息学院——鲁 宁FOR-LOOP 示例:计算N!declarei i int int int;; N N int int int;; k number:=1;beginN:=&N;for i in 1..Nloopk:=k k:=k**i; end loop;dbms_output.put_line('5!='|| dbms_output.put_line('5!='||to_char(k to_char(k to_char(k));));end;西南林业大学计算机与信息学院——鲁 宁S=1!+2!+3!+S=1!+2!+3!+……+N!declareM M int int int;; S number:=0;k number:=1;beginM:=&N;for i in 1..Mloopk:=k k:=k**i; S:= S:=S+k S+k S+k;; end loop;dbms_output.put_line('1!+2!+3!+ dbms_output.put_line('1!+2!+3!+……+N!='||+N!='||to_char(S to_char(S to_char(S));));end;GOTO 语句•无条件跳转到一个标签•执行时,语句将更改PL/SQL 程序块的控制流•编制GOTO 语句代码需要有两个部分–定义标签名称–使用GOTO 语句将控制转到标签•在下列位置可以使用GOTO 语句来转移控制–从程序块到可执行语句–从异常处理程序分支到封闭的程序块西南林业大学计算机与信息学院——鲁 宁GOTO 语句(续)•标签名称–可以选择将其用于命名PL/SQL程序块或程序块中的语句–使用尖括号进行定义(<< >>)<<if_fare_label>>IF 条件THEN语句;END IF;语句;GOTO if_fare_label;西南林业大学计算机与信息学院——鲁 宁GOTO 语句•不允许在下列位置使用GOTO 语句来转移控制–从某个IF 语句或循环子句内转到其他语句–从封闭程序块转到某个子程序块–从异常处理程序转到当前程序块–子程序之外–转到关键字西南林业大学计算机与信息学院——鲁 宁西南林业大学计算机与信息学院——鲁 宁NULL 语句•明确指定不进行操作(例如,除了将控制转移到下一个语句而不进行任何操作) •它提高了可读性IF IF newfare newfare newfare > 90 THEN> 90 THEN 语句;ELSENULL;END IF;注释的使用•添加注释可以提高程序的可读性并帮助理解•PL/SQL 支持两种注释样式–单行注释–可以在行中的任何地方以双分号(--) 开始–可以扩展到行尾–多行注释–这些注释以/*开始并以*/结束–可以跨越多行西南林业大学计算机与信息学院——鲁 宁异常简介•错误条件称为异常•错误发生时,产生异常,这些异常包括常规执行停止并PL/SQL 程序块或子程序的异常处理且控制转移到了 PL/SQL部分•要处理产生的异常,需要编写单独的称作异常处理程序的例程•有两类异常–预定义异常(内部异常)–用户定义的异常西南林业大学计算机与信息学院——鲁 宁。
翻译:陈拓 chentuo@2006 年 6 月16 日更多包的概念Copyright © Oracle Corporation, 2001. All rights reserved.进度表: 时间 主题40 分钟 讲演25 分钟 练习65 分钟 总共目标完成本课程后, 您应当能够:• 用重载特性写包• 说明子程序相互引用的规则• 用单次执行 (onetimeonly) 过程初始化变量• 确定持久状态62 Copyright © Oracle Corporation, 2001. All rights reserved.本课目标本课介绍更多的PL/SQL高级特性,包括覆盖、前向引用、单次执行过程和变量、 常量、表达式和游标的持久性。
你还将学习怎样创建和使用包。
还要看看用在SQL语 句中的包函数的作用。
重载 (Overloading)• 使你能够对在 PL/SQL 块、子程序或包中的不同的子程序使用的相同的名字• 要求子程序形式参数的个数、顺序或数据类型不同• 使得你可以更灵活地构建应用程序。
因为重载使用户或 应用程序不被形式参数指定的数据类型或个数所限制注:本地或打包的子程序可以被重载。
单独的子程序不能重载。
63 Copyright © Oracle Corporation, 2001. All rights reserved.重载重载特性使你能够用相同的名字定义不同的子程序。
你可以用用名字和参数区别这 些子程序。
有时在两个子程序中的过程是相同的,但传递给它们的变量的参数不同。
在 这种情况下,只是逻辑上给它们以相同的名字。
PL/SQL 靠检查其形式参数确定哪一个 子程序被调用。
只有本地或打包的子程序可以被重载。
独立的子程序不能被重载。
限制下面的情况不能重载:§两个子程序如果它们的形式参数只是数据类型不同,并且不同的数据类型具有 相同的大类 (NUMBER 和 DECIMAL 就属于相同的大类)。