PLSQL讲义.doc
《PLSQL讲义.doc》由会员分享,可在线阅读,更多相关《PLSQL讲义.doc(43页珍藏版)》请在咨信网上搜索。
1、第一章:PL/SQL概述一、什么是PL/SQL ORACLE公司发明PL/SQL为了克服SQL语言自身的一些缺陷并为那些要在ORACLE中运行核心业务提供一种完整的解决方案。PL/SQL具有以下特点l 是一种高度结构化、易读易理解的语言l 是一种标准的、可移植的ORACLE语言,实现了编写一次到处运行l 是一种嵌入式语言,必须在特定的宿主环境内执行,不能编写一个PL/SQL可执行程序l 是一种高性能的、高集成度的数据库语言,如果你使用VB、DELPHI等进行数据库开发,最终你会发现使用PL/SQL将比其他任何语言都跟轻松高效二、改进的执行授权和事物一致性数据库和SQL语言让我们可以紧密地控制对
2、任何个别数据库表的访问和修改,例如可以通过GRANT命令确保只有特定的角色和用户可以对指定的表执行更新操作,另一方面GRANT命令不能确保用户或者应用执行的更新操作能够正确执行,换句话说,数据库不能确保跨越多个表的事物一致性,在业务事务中涉及多个表是很常见的。PL/SQL实现紧密地控制和管理能力是通过执行授权。我们只是授权执行某个过程,后者控制对底层数据结构的访问。从ORACLE8I开始,PL/SQL提供了AUTHID子句,我们可以使用之前描述的定义者权限模型,也可以使用调用者权限模型。三、PL/SQL结构:SQL整合Declare I_book_count int;Begin Select
3、count(*) into i_book_count from books where author like 12; Dbms_output.put_line(123); -改名 Update books set author = 31;End;说明:Declare:声明单元Begin:执行单元-:注释出现错误PL/SQL提供了强大的错误处理机制Procedure check_account(account_id_in in accounts.id%type)IsI_balance_remaining number;I_balance_below_minimum exception;I_ac
4、count_name account.name%type;Begin Select name into i_account_name from accounts where id = account_id_in; I_balance_remaining := account_balance(account_id_in); If i_balance_remaining 1000 Then Raise i_balance_below_minimum; End if;Exception When no_data_found Then log_error(.); When i_balance_belo
5、w_minumum Then log_error(.); Raise;End;第二章:语言基础2.1、PL/SQL块结构块:最小的有意义的代码单元,一个块就是一组代码,这个块给出了执行边界,也为变量声明和异常处理提供了作用范围,PL/SQL允许我们创建匿名块和命名块,命名块可以使包、过程、函数、触发器或者对象。一个PL/SQL块最多可以由4个不同的单元组成,只有一个单元是必不可少的HeaderIs Declaration sectionBegin Execution sectionException Exception sectionEnd;块头:只有命名块才会有这个单元,块头单元确定了这个命
6、名块或者程序的调用方法,这个单元是可选的。声明单元:这部分定义变量、游标以及可以被后面的执行单元或者异常处理单元引用的子块,这一单元也是可选的。执行单元:这部分包含PL/SQL引擎运行时要执行的语句,这一单元时必须的。异常处理单元:这部分处理过程中抛出的异常,这一单元也是可选的。Procedure get_happy(ename_in in varchar2)IsI_hiredate date;BeginI_hiredate := sysdate -2;Insert into employee(emp_name,hiredate) values (ename_in,i_hiredate);Ex
7、ceptionWhen dup_val_in_indexThenDbms_output.put_line(cannot insert.);End;2.2、匿名块如果这个块没有头部单元,直接以DECLARE或者BEGIN开始,这个块就叫做匿名块。匿名块没有一个可用于引用的句柄,因此不能被其他块调用,相反,匿名块作为执行PL/SQL语句的一个容器,经常会调用过程和函数,因为一个匿名块可以由它自己的声明单元和异常处理单元,开发人员经常会在一个大的程序中借助嵌套匿名块的方式以提供一系列标示和异常处理。一个匿名块的语法:declare .声明语句Begin .一个或多个执行语句exception .异常
8、处理语句End;一个最小的匿名块BeginDbms_output.put_line(sysdate);End;一个添加了声明单元的匿名块DeclareI_right_now varchar2(9);BeginI_right_now := sysdate;Dbms_output.put_line(i_right_now);End;一个添加了异常处理单元的匿名块DeclareI_right_now varchar2(9);BeginI_right_now := sysdate;Dbms_output.put_line(i_right_now);ExceptionWhen value_errorTh
9、enDbms_output.put_line(123);End;2.3、命名块命名块与匿名块的区别在于头部分:过程的头部分Procedure schema.nameparameter,parameter. authid definer|current_user函数的头部分Function schema.nameparameter,parameter.Return return_datatypeauthid definer|current_userparallel enablepipelined using |aggregate using因为ORACLE允许在SQL语句中调用函数,因此函数的头
10、部会比过程的头部有更多的可选成员。2.4、嵌套块PL/SQL借鉴了ADA和PASCAL语言,因此块可以嵌套到其他块中。Procedure calc_totalsIsYear_total number;BeginYear_total := 0;/*嵌套块开始*/DeclareMonth_total := number;BeginMonth_total := year_total/12;End set_month_total;/*嵌套块结束*/End;被嵌套块也可称为闭包块、子块。外层的PL/SQL块也称为包围块、父块。总的来说、嵌套块的好处就是为我们提供了一个可以在代码中控制作用范围和可见性的方
11、法。DeclareCursor emp_cur is ;BeginDeclareTotal_sales number;BeginDeclareI_hiredate date;BeginEnd;End;End;2.5、作用范围在任何一种编程语言中,作用范围的意思都是指确定一个给定标示符所指代的“具体东西”的方法。如果标示符多次出现,语言本身的作用范围规则将用于定义到底是用的哪一个。在PL/SQL中,变量、异常、模块和一些其他的结构都属于声明他们的块局部的,当这个块执行结束后,我们再也无法引用这些结构了,比如calc_total过程中,我们可以再过程内的任何地方引用外部块的元素,比如year_to
12、tal变量,然而在内部块声明的元素对于外部块是不可见的。Package scope_demoIsg_global number;procedure set_global (number_in in number);end scope_demo;package body scope_demoisprocedure set_global (number in number)isi_salary number := 10000;i_count pls_integer;beginDeclarei_inner number;beginselect count(*) into i_count from e
13、mployeeswhere department_id = i_inner and salary i_salary;end local_block;g_global := number_in;end set_global;end scope_demo;任何对scope_demo包具有execute授权的模式的任何代码块都可以使用变量scope_demo.g_global。而i_salary这个变量只能在set_global过程内部使用。I_inner这个变量只能被局部或者嵌套块内部使用。2.6、规范SQL语句中所有对变量和列的引用Package scope_demoIsg_global num
14、ber;procedure set_global (number_in in number);end scope_demo;package body scope_demoisprocedure set_global (number in number)isi_salary number := 10000;i_count pls_integer;beginDeclarei_inner number;beginselect count(*) into set_global.i_count from employeeswhere department_id = local_block.i_inner
15、 and salary set_global.i_salary;end local_block;scope.demo.g_global := set_global.number_in;end set_global;end scope_demo;做了这些改动后,对每一个变量或者列的引用都通过表的别名、报名、过程名或者嵌套块的标签名规范化了。这么做的好处在于:l 改善代码的可读性l 避免由于变量名和列名一样时可能出现的BUGl 充分利用ORACLE11G的细粒度依赖这一特性2.7、可见性DeclareA date;B date;BeginA := sysdate;B := add_months(a
16、,6);End;因为a,b两个变量的声明是在同一个块中,我们可以非常方便仅通过非规范化的标示符来引用他们,这些标示符也被称为可见标示符,一个可见标示符实际上可能属于以下情况:l 一个在当前块声明的标示符l 一个在包含当前块的块中声明的标示符l 属于你所有的一个单独的数据库对象l 一个你能看到是数据库别名l 一个循环体中的索引变量Package pany_pkgIsLast_pany_id number;End pany_pkg;然后可以再包的外面应用这个变量If new_pany_id = pany_pkg.last_pany_id then在默认情况下,给一个包级别的变量所赋的值只会在当前数
17、据库会话的生命周期内有效,不会超过会话生命周期。Procedure calc_totalsIsSalary number;Begin.DeclareSalary number;BeginSalary := calc_totals.salary;End;.End;声明的第一个salary创建了一个作用域时整个过程范围的标示符,在嵌入块中声明了另一个同名的标示符,因此在内部块中引用变量salary时它会优先解释称内部块中声明的变量,因为这个变量是无需任何规范化就是可见的。Procedure remove_order (order_id in number)IsBeginDelete orders
18、where order_id = order_id;End;这段代码的结果是删除order表中一切内容,尽管已经传入可order_id。其原因是:SQL的名称解析规则首先使用的是列名而不是PL/SQL标示符。因此,在编写代码时应该要有预见性,如果不想通过把每个变量都规范化从而保证其唯一性,那就需要某种小心地命名规范以避免这些冲突。2.8、PL/SQL字符集PL/SQL中的特殊符号符号说明;一个声明和语句的结束%属性指示符如%isopen,%rowtype;也用作like通配符_Like中的单字符通配符远程位置指示符:宿主变量标示符*幂运算 != =不等于|连接符标签符=大于等于、小于等于:=赋
19、值=位置表示法使用的关联操作符.范围操作符-单行注释/*/多行注释2.9、标识符标识符就是一个PL/SQL对象名字,包括:l 常量或者变量l 异常l 游标l 程序名l 保留字l 标签标识符的默认属性l 长度最多30个字符l 必须字母开始l 可以带有$ _ #符号l 不能有任何空白字符l 通常不区分大小写,除非带上双引号2.10、直接量所谓直接量就是那些不是通过标识符表现出来的值,它只是一个值。与标识符不同,字符串直接量是大小写敏感的,如:If Steven = steven 结果为false2.11、null在ORACLE数据库中,一个值的缺失是通过关键字NULL来标示的,差不多所有的数据类型
20、的PL/SQL变量都可以由NULL状态,唯一例外是关联数组类型。在ORACLE SQL和PL/SQL中,一个空字符串和零个字符的直接量时没有区别的如 is null 结果为true在pl/sql中给一个varchar2(n)变量赋值一个长度为0 的字符串,导致的结果就是null。但如果在pl/sql中给char(n)变量赋值一个长度为0的字符串,数据库会用空格字符填满这个变量。因而这个变量不为null。尽管如此,这种行为只在PL/SQL中存在,如果在数据库中,当向CHAR类型列插入长度为零的字符串,数据库不会用空格把内容填满,而是null。这说明ORACEL只是部分采纳了ANSI SQL标准9
21、2和99的要求。2.12、在一个直接量字符串中嵌入单引号如果想让字符串中带有一个单引号,我们需要使用两个紧挨的单引号theres no body.theres no body123123从10G开始,数据库引入了用户自定义分隔符q (theres no body.) theres no bodyq 123123qq|如例子演示的,我们可以使用简单的分割符如| !,或者使用成对的如、进行分割。2.13、pragma关键字Pragma通常告诉编译器该采取什么行为如Autonomous_transaction告诉PL/SQL引擎,当前块对数据库所做的提交或修改不影响主事务或者外层事务。Excepti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PLSQL 讲义
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。