PLSQL应用程序开发.pdf
《PLSQL应用程序开发.pdf》由会员分享,可在线阅读,更多相关《PLSQL应用程序开发.pdf(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 1 Oracle PL/SQL ProGramming 学习笔记学习笔记 Author:丁俊丁俊 目目 录录 序言-特点介绍.2 PART1 用 PL/SQL 设计程序.4 第一章 plsql 在 10g 中的新特性.4 第二章 建立和运行 plsql 程序.6 第三章 plsql 语言基本原理.9 PART2 PL/SQL 应用程序结构.12 第四章 条件和序列控制.12 第五章 循环控制.19 第六章 异常处理.23 PART3 PL/SQL 程序应用.25 第七章 用数据来工作.25 第八章 Strings.27 第九章 Numbers.31 第十章 Records.36 第十一章 集
2、合类型.38 2 序言序言-特点介绍特点介绍 1-1 pl/sql 可以做的工作:1.用 pl/sql 的存储过程和数据库触发器实现至关重要的商业规则。2.在数据库中生成和完全地管理 xml 文档。3.web 页面与数据库的结合。4.实现自动化的数据库管理,用 pl/sql 建立安全级别来管理回滚段。1-2 pl/sql 特点:从 oracle 6 开始,模仿 Ada 语言的实现,Ada 语言强调数据抽象,信息隐藏,还有其他现代语言设计中的关键策略。pl/sql 做为 3GL 语言具有面向过程语言的许多重要特性,如:1.丰富的数据类型,从 number 到 string,从复杂的 record
3、 到 table,以及集合类型等。2.显示的可读性强的块状结构,可以增强我们维护 plsql 程序。3.条件,循环语句,包括 if-else,3 个 loop 循环(简单 loop,for.loop,while.loop)。4.完整地异常处理机制。5.命名的,可重用的代码,如包,函数,过程,触发器,对象类型等。6.plsql 是 sql 的有力补充,与 sql 之间的联系紧密,整合性强。7.plsql 是 oracle 数据库产品的内置语言,不是一个孤立的语言。8.是一种高性能的语言。9.pl/sql 运行过程 Plsql 引擎可以接受应用程序的程序,然后将 sql 部分和 plsql 部分分
4、离出来,分别交给 sql引擎和 plsql 引擎执行,提高执行效率。10.plsql 可以每次发送成组的 sql 语句到服务器端执行,不像 sql 每次只能发送一句,减少网络负载量,提高效率,而且在 oracle 的相关工具中,如 oracle form中,plsql 也得到增强。11.总结一句话:plsql 有应用程序的特性,是 sql 的有力补充,具有流程控制,申明和使用变量,plsql 能运行在任何具有 oracle 的环境中。3 12.plsql 支持 dml,select 语句,不直接支持 ddl,用动态语句,execute immediate,不支持权限控制如 grant 和 re
5、voke。4 PART1 用用 PL/SQL 设计程序设计程序 第一章第一章 plsql 在在 10g 中的新特性中的新特性 1.自动的,最佳代码编译 oracle 10g 发布的第 1 版本 10.1 会重新组织代码从而提高效率。非 sql 区域的效率会提高 2倍 2.编译期警告 3.预编译功能,指定条件编译 最佳编译最佳编译(optimized compiler)在 10.1 中默认为最佳编译,可以通过修改会话 session 来实现指定编译 0 无最佳编译 1 中等最佳编译,可以消除过剩代码和异常 2 默认级别,最佳编译 ALTER SESSION SET PLSQL_OPTIMIZE_
6、LEVEL=0;也可以指定 procedure 的编译,先设过程级别,然后用 reuse ALTER PROCEDURE bigproc COMPILE PLSQL_OPTIMIZE_LEVEL=0;然后使用 ALTER PROCEDURE bigproc COMPILE REUSE SETTINGS;编译期警告 ALTER SESSION SET plsql_warnings=enable:all 条件编译 用$IF 指定 如 CREATE OR REPLACE PROCEDURE calculate_totals IS BEGIN$IF$oe_debug AND$oe_trace_leve
7、l=5$THEN DBMS_OUTPUT.PUT_LINE(Tracing at level 5 or higher);$END NULL;END calculate_totals;支持非连续的集合用 forall,在 10g 之间用 forall 只能是连续的集合,forall 与批处理 bulk collection 联合用,bulk collection 可以减少 plsql 的引擎和 sql 引擎之间的相互转换的次数,所以能提高效率。10g 之后可以是非连续的单元,用 INDICES OF 指定,如 FORALL i IN INDICES OF inactives DELETE FRO
8、M ledger WHERE acct_no=inactives(i);forall 指定集合的值,用 values of 5 FORALL i IN VALUES OF inactives_list DELETE FROM ledger WHERE acct_no=inactives(i);提高数据类型的支持 oracle 10g 的所有数字类型的全部采用机器运算,提高效率,对浮点数运算采用二进制,提高金融业计算的准确性,单精度 BINARY_FLOAT,双精度 BINARY_DOUBLE 支持 set 操作符 支持正则表达式 可以定义自己的引号处理,用 q,表示分界,指一个单引号,后面可以
9、使用(,select q from dual;Q -Thiss a cat SQL select q_ from dual;Q_ -SQL select nqa from dual;NQ -a SQL select nq_a_ from dual;NQ -a 更多的 built_in 包,并且扩展了原来的包 DBMS_SCHEDULER 更新 DBMS_JOB.DBMS_SCHEDULER DBMS_CRYPTO 提供加密技术 DBMS_MONITOR 监控 DBMS_WARNING 编译警告控制 6 第二章第二章 plsql 开始开始 1-1 sql*plus 使用 登陆连接数据库 sqlp
10、lus dingjun123/198403 不推荐使用,暴露密码 sqlplus 会提示输入用户名,密码 sqlplus/nolog 不连接数据库,然后在 connect dingjun123/198403 不会暴露密码 show all 显示所有 sql*plus 设置 用户定义变量 define x=test;/注意与绑定变量的区别,直接定义 define x=test 也是正确的 显示 define x,显示值和类型 Define 显示所有的变量 定义是 define name=value,而绑定变量定义的时候不能赋值 引用定义的变量,用&x,要加,否则就是另一种情况了 select&x
11、 from dual;绑定变量 define x=test;variable x varchar2(10);/variable 可以简写成 var begin :x:=ding;-绑定变量有前缀:end;/select:x,&x from dual;SQL select:x,&x from dual;原值 1:select:x,&x from dual 新值 1:select:x,dsadsa from dual :X DSADSA -dd dsadsa L 显示所有缓冲区内容 n 显示第几行 del n 删除第几行 c/old/new n text 插入到第 n 行 i 插入 7 1-2 绑
12、定变量 1.申明:直接在 salplus 中 variable x varchar2(10);不能赋值。绑定变量可以直接在 plsql 中使用,使用要加前缀:绑定变量是直接在主机环境中申明的,不能在 plsql 块中申明,在运行期赋值。一般针对可能使用很多变量,但是不清楚的情况下使用。可以提高效率。引号绑定变量必须加前缀:如:begin :x:=dj;end;/这样已经初始化了绑定变量 x,看 x 的结果用 print x 或 print:x 2.如果用函数来给绑定变量赋值可以使用 call function_name into:x,z 只有在单条语句上使用,在过程中用:x :=函数;3.在
13、PLSQL 中使用绑定变量有很多优点,可以从外部传参数的值,使过程的执行只进行一次硬分析,其他都是软分析,从而提高程序和语句的执行效率。1-3 创建函数 函数直接可以在 sql 中使用,有返回类型,不涉及特定表操作,与过程不一样 1.创建一个连接字符串的函数-在参数中不写 in 也可以,也可以初始化,但是不能带长度 create or replace function concatestring(a in varchar2,b in varchar2)return varchar2 as c varchar2(100);begin c:=a|b;return c;end;/-select co
14、ncatestring(ding,jun)result from dual/-结果:RESULT-dingjun 注:注:set echo on 是用是用命令时候,会把调用的内容显示出来命令时候,会把调用的内容显示出来 8 a.所有能使用create语句建立的对象都可以使用drop语句来删除,如删除函数是drop function function_name;过程删除是 drop procedure procedure_name 等。b.表,函数,过程,序列,同义词,包等对象名称不能重复,否则创建不成功。如果是过程,函数,包等同类型的有占用名字的可以用 create or replace 创建
15、,但是建立表等没有 create or replace table c.如果出错可以用 show err 来查看上次详细情况,如果全局查看可以使用 show err 对象类别 schema.名称,其中 err 是 errors 的部分。对象范围如下:SQL show error table test 用法:SHOW ERRORS FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|TRIGGER|VIEW|TYPE|TYPE BODY|DIMENSION|JAVA SOURCE|JAVA CLASS schema.name 养成良好的习惯,写完一个对象,show e
16、rror 一下 CREATE OR REPLACE program-type AS your code END;/SHOW ERRORS d.要查询定义的对象可以在 all_objects 和 user_objects 里面查询 e.所有的对象都可以使用 desc 语句在 sqlplus 中 9 第三章第三章 plsql 语言基本原理语言基本原理 1.块结构:申明和执行严格区分,在 plsql 中以 begin 为界限区分|head 命名块才有的,如函数和过程|-|declare 对变量,过程,子程序声明|execute 执行处理|exception 捕获和处理异常 块的划分:匿名块,命名块,
17、嵌套块(在执行块里可以嵌套一个完整的块,注意变量可见域)2.标识符的限制:最好用有意义的名字,同名的要注意加前缀,如 create or replace procedure remove(name in varchar2)as begin delete a where name=name;-删除表也可以不使用 from end;这样,条件始终是真,把 a 全部删除。就算改成 a.name=name 也是一样,只能把=的右边改成能区分的,如 加上 remove.name 这样就可以避免此情况。package,function,procedure 等的参数或变量都可以通过前缀访问。特殊的可以加双引
18、号,则使用时也加双引号,则区分大小写。如PI和pi是不同的变量。如 declare PI constant number:=3.14;-双引号区分大小写 pi constant number:=3.1415;begin dbms_output.put_line(PI is|PI|pi is|pi|pi);-pi不加双引号默认为大写 end;/结果是 PI is 3.14 pi is 3.1415 3.14 3.程序的嵌套(子程序申明)10 CREATE PROCEDURE calc_totals(fudge_factor IN NUMBER)IS subtotal NUMBER:=1;/*|申
19、明子程序,在申明部分申明子的过程,不用create */PROCEDURE compute_running_total IS BEGIN subtotal:=subtotal+subtotal*fudge_factor;END;/*子程序结束*/BEGIN FOR mth IN 1.12 LOOP compute_running_total;END LOOP;DBMS_OUTPUT.PUT_LINE(Fudged total for year:|subtotal);END;子程序可以提高代码的可重用性和可维护性。标识符:标识符:包括常量,变量,异常,游标,程序:过程,函数,包,触发器等,保留字
20、,标签 Plsql 中阶乘直接可以使用*,而 sql 中不可以,只能用 power 函数 规范:规范:最多 30 个字符限制(oracle 中所有限制),只能以字母开头,后面可以有下划线,$,字母,#,其他不可以,不能有空格,不能是保留字。大小写不敏感,但是要注意关键字大写,变量等小写。不能是数据库已经有的字段名,如列名.单行函数,转换函数,一般函数都可以在 plsql 中使用,但是组函数在 plsql 中只能在 sql 语句中使用,不能使用 decode。11 查看保留字可以以 DBA 身份登陆,SELECT*FROM V$RESERVED_WORDS;标量:数字,字符,日期,boolean
21、 其中 null 对所有均适合,null 也可以作为合法语句存在。在 oracle 中 0 个字符可以表示 null,如和 null 一样,但是中间不能有空格。m varchar2(10):=和 null 一样,但是 m char(10):=和 null 就不一样了,默认有一个字符,也就是 m char(10):=其实 oracle 会自动给予 的值。oracle 中的引号 用两个引号表示一个引号,如 theres a cat-theres a cat a-a-hello-hello-oracle 10g 中对引号的处理可以:PRAGMA instruction_to_compiler;对编译
22、的限制 标签,由内循环到外循环,由内过程到外过程,goto 等 12 PART2 PL/SQL 应用程序结构应用程序结构 第四章第四章 条件和序列控制条件和序列控制 1-1 条件语句 3 种 if-then-end if;if-then-else-end if;if-then-elsif-then-else-end if;(不是else if)注意 f,还有 else 在三种情况下可以省略。为了完整性可以加 esle null;1.条件是 boolean 类型,若是 2null 则肯定为 false,和 null 运算的都是 false 2.如果数据来自数据库,若有 null 存在,可以加上
23、or is null 避免或者用 nvl 函数来解决 null的问题。3.my_boolean:=condition1 AND condition2 若 condition1 为 null,则语句的值可能是 null也可能是 false 取决于 condition2 的值。短路的好处 IF condition1 OR condition2 THEN .ELSE .END IF;如果第一个为 true,则不用判断第二个 IF low_CPU_condition AND high_CPU_condition THEN .END IF;如果第一个已经确定是 false 则不会计算第二个消耗高内存的表
24、达式 显示用短路,可以使用 nest IF low_CPU_condition THEN IF high_CPU_condition THEN .END IF;END IF;1-2 case 语句(statements)和表达式(expressions)case 语句是一种顺序执行数据,允许按条件匹配到指定的第一个表达式,然后结束。在sql 中是 sql92 的标准,但是在 oracle 的 sql 中一直到 oracle 8i 才给予支持,pl/sql 支持 case是在 oracle 9i 开始的。13 null 是什么?在 oracle 中,boolean 类型的值的确有三个:true,
25、false,null。但是在大的关系型理论中,认为 null 不应该属于 boolean 类型,如:2=10000 THEN CASE WHEN salary 40000 THEN give_bonus(employee_id,500);WHEN salary 20000 THEN give_bonus(employee_id,1000);END CASE;-内部 case 结束 WHEN salary=10000 AND salary 20000 AND salary 40000 THEN 500 ELSE 0 END);END;注:case 表达式到 end 处为整个表达式结束,相当于整个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PLSQL 应用程序 开发
限制150内