版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数与存储过程第1页,共25页,2023年,2月20日,星期三8.1函数函数是Oracle数据库中常用对象之一,与其他编程语言的函数一样,Oracle中的函数也必须返回一个值。这也是函数区别于存储过程的重要特征。第2页,共25页,2023年,2月20日,星期三8.1.1函数简介1.函数与功能的划分2.函数的参数3.函数的返回值第3页,共25页,2023年,2月20日,星期三8.1.2创建函数1.创建函数createorreplacefunctionget_hello_msgreturnvarchar2asbeginreturn'helloworld';endget_hello_msg;2.在数据字典中查看函数的信息selectobject_name,object_type,statusfromuser_objectswherelower(object_name)='get_hello_msg'3.查看函数的返回值
setserverouton;declaremsgvarchar2(20);beginmsg:=get_hello_msg;dbms_output.put_line(msg);end;第4页,共25页,2023年,2月20日,星期三8.1.3函数中的括号其他标准编程语言中,函数的括号都是必需的,但是函数get_hello_msg并没有使用小括号。当函数需要传入参数时,参数列表必须使用小括号括起来,但是当函数没有参数时,小括号可以省略。当函数没有小括号时,在形式上和变量相同,那么有可能会产生变量冲突。第5页,共25页,2023年,2月20日,星期三8.1.4函数的参数在8.1.2节中创建的函数get_hello_msg是无参数函数,本节将演示带参数函数的创建和使用。createorreplacefunctionget_tax(p_salarynumber)returnnumberasbegindeclaretax_salarynumber;begintax_salary:=p_salary-2000;
iftax_salary<=0thenreturn0;endif;
returntax_salary*5/100;endendget_tax第6页,共25页,2023年,2月20日,星期三8.1.5函数的确定性每次调用函数,Oracle总是根据传入的参数,执行相同的步骤,并返回最终值。函数的确定性是指,传入的参数一定,无论函数被调用多少次,都会返回相同的值。例如,对于get_tax函数,每次输入相同的工资额,那么,返回值都不会改变。createorreplacefunctionget_tax(p_salarynumber)returnnumberdeterministicas
begindeclaretax_salarynumber;endget_tax;对于具有确定性的函数,在定义时,可以使用deterministic选项,以告知Oracle创建确定性函数。第7页,共25页,2023年,2月20日,星期三8.1.6典型函数举例行转列问题是一个常见的问题,即将多行数据转换为一列。例如,在学生表中,存储了很多学生资料,现欲获得所有学生的姓名列表,常见做法是将所有学生姓名串联起来,即多行转一列。【范例8-7】selectget_student_string()fromdual第8页,共25页,2023年,2月20日,星期三8.2存储过程存储过程(StoreProcedure)对应于其他编程语言中的过程。存储过程不必返回值,但是可以有参数。本节将详细讲述存储过程的创建及使用。第9页,共25页,2023年,2月20日,星期三8.2.1存储过程简介1.提高数据库执行效率2.提高安全性3.可复用第10页,共25页,2023年,2月20日,星期三8.2.2创建存储过程1.创建存储过程createorreplaceprocedureupdate_studentsasbeginupdatestudentssetSTUDENT_AGE=10commit;endupdate_students;
2.查看存储过程在数据字典中的信息selectobject_name,object_type,statusfromuser_objectswherelower(object_name)='update_students'select*fromuser_sourcewherelower(name)='update_students'
3.执行存储过程executeupdate_students;第11页,共25页,2023年,2月20日,星期三8.2.3存储过程的参数——IN参数IN参数,顾名思义,是指传入参数,即只进不出的参数。它由调用者传递给存储过程之后,存储过程在执行过程中,无论怎样使用该参数,都无法改变该参数的值。该参数对于存储过程来说,是只读的。例如,在更新学生信息的存储过程update_stduents中,可以传入一个年龄参数,用以标识需要将学生年龄修改为多少岁。createorreplaceprocedureupdate_students(in_ageinnumber)asbeginupdatestudentssetstudent_age=in_age;---in_age:=in_age+10;commit;endupdate_students;executeupdate_students(12);第12页,共25页,2023年,2月20日,星期三8.2.4存储过程的参数——OUT参数函数可以有返回值,存储过程并没有显式的返回值。但是可以通过OUT参数获得存储过程的处理结果。在范例8-11中,更新了表students中的学生年龄,可以通过OUT参数返回更新之后的值,以便验证更新是否成功。createorreplaceprocedureupdate_students(in_ageinnumber,out_ageoutnumber)asbeginupdatestudentssetstudent_age=in_age;selectstudent_ageintoout_agefromstudentswherestudent_id=1;commit;endupdate_students;declareupdated_agenumber;beginupdate_students(20,updated_age);dbms_output.put_line(updated_age);end;第13页,共25页,2023年,2月20日,星期三8.2.5存储过程的参数——INOUT参数INOUT参数既可以作为输入参数,也可以作为输出参数。因此,INOUT参数一般用于对参数的值进行处理,并处理结果输出。一个典型实例就是交换两个变量的值。createorreplaceprocedureswap(in_out_param1inoutnumber,in_out_param2inoutnumber)asbegindeclareparamnumber;beginparam:=in_out_param1;in_out_param1:=in_out_param2;in_out_param2:=param;end;end;declareparam1number:=25;param2number:=35;beginswap(param1,param2);dbms_output.put_line('param1='||param1);dbms_output.put_line('param2='||param2);end;第14页,共25页,2023年,2月20日,星期三8.2.6存储过程的参数——参数顺序像其他编程语言一样,存储过程的参数顺序同样重要。在以上范例中,所有参数在调用时的值都是按照顺序分配给存储过程。那么顺序就显得格外重要,如果顺序颠倒,不仅得不到正确结果,而且有可能返回不可预知的错误。createorreplaceprocedureupdate_students(in_ageinnumber,in_nameinvarchar2)asbeginupdatestudentssetstudent_age=in_agewherestudent_name=in_name;commit;endupdate_students;名称表示法:beginupdate_students(in_name=>'柳青',in_age=>19);end;第15页,共25页,2023年,2月20日,星期三8.2.7存储过程的参数——参数的默认值有时,存储过程的参数有很多个。对于用户来说,部分参数并非必需,那么,在定义存储过程时应该为可选参数设定默认值,以允许用户不为该参数传值。需要注意的是,默认值是仅对IN参数而言,OUT和INOUT参数没有默认值。范例8-17演示了如何使用IN参数的默认值。createorreplaceprocedureinsert_student(in_student_idinnumber,in_student_nameinvarchar2,in_student_ageinnumberdefault20)asbegininsertintostudentsvalues(in_student_id,in_student_name,in_student_age);commit;endinsert_student;begininsert_student(11,'王蒙');end;第16页,共25页,2023年,2月20日,星期三8.2.8存储过程的参数——参数顺序总结在讲解了三种参数的用法之后,可以对参数的顺序总结如下:具有默认值的参数应该置于参数列表的末尾,因为有时用户需要省略该参数;没有默认值的参数可以遵循“IN参数”——>“OUT参数”——>“INOUT参数”。第17页,共25页,2023年,2月20日,星期三8.3程序包程序包可以将若干个函数或者存储过程组织起来,作为一个对象进行存储。程序包通常由两部分构成:规范(specification)和主体(body)。程序包也可以包含常量和变量,包中的所有函数和存储过程都能够使用这些变量和常量。第18页,共25页,2023年,2月20日,星期三8.3.1规范1.创建程序包规范createorreplacepackagepkg_studentsasstudentStringvarchar2(500);studentAgenumber:=18;functionget_student_stringreturnvarchar2;procedureupdate_student(in_student_idinnumber);procedureinsert_student(in_student_idinnumber,in_student_nameinvarchar2,in_student_ageinvarchar2);proceduredelete_student(in_student_idinnumber);endpkg_students;2.在数据字典中查看程序包规范的信息selectobject_name,object_type,statusfromuser_objectswherelower(OBJECT_NAME)='pkg_students'第19页,共25页,2023年,2月20日,星期三8.3.2主体1.创建程序包主体createorreplacepackagebodypkg_studentsasendpkg_students;范例:createorreplacepackagebodypkg_studentsasfunctionget_student_stringreturnvarchar2isbeginreturn'students';endget_student_string;endpkg_students;2.在数据字典中查看该程序包主体的信息selectobject_name,object_type,statusfromuser_objectswherelower(OBJEC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六年级下册第五单元练习题(语文、数学、英语)
- 初中学生评价评语
- 某食品公司连锁运营部员工守则文档范本
- 健康医疗业远程医疗服务系统建设方案
- 储运罐区安全技术规程
- 别墅季度宣传推广方案
- 光网络传输技术阅读随笔
- 保护地球的环境的建议书(33篇)
- 大学生心理健康教育教学参考
- 26-第十一章 血压监测与显示实验
- 活动策划报价方案
- 七下语文课内文言文阅读夯实基础训练(含答案)
- 学生课堂表现观察记录表模板
- 实施指南(2025)《DL-T5187.3-2012 火力发电厂运煤设计技术规程第 3 部分》
- DB65-T 4877-2024 学校食堂“互联网+明厨亮灶”建设规范
- 2024年下半年成都铁路文化传媒有限责任公司校招笔试题带答案
- 【MOOC答案】《电子线路设计、测试与实验(二)》(华中科技大学)章节作业慕课答案
- 特殊困难老年人家庭适老化改造工作台账
- 标准化厂房总体设计方案
- 关键设备检修管理制度
- 北师大版五年级数学下册 第八单元 1复式条形统计图 同步练习(含答案)
评论
0/150
提交评论