




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、PL/SQL 程序设计简介1.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)。目前的PL/SQL包括两部分,一部分是数据库引擎部分;另一部分是可嵌入到许多产品(如C语言,JAVA语言等)工具中的独立引擎。可以将这两部分称为:数据库PL/SQL和工具PL/SQL。两者的编程非常相似。都具有编程结构、语法和逻辑机制。工具PL/SQL另外还增加了用于支持工具(如Oracle Forms)的句法,如:在窗体上设置按钮等。本章主要介绍数据库PL/SQL内容。1.2 PL/SQL的好处l 减少网络传输量l 开发标准的代码l 力争低偶联与高内聚性(少用全局变量和建立包来实现)l 隐藏实现细节l 统一的和集中的方式处理工程项目,以达到重用l 更好地设计数据库应用(标准化、降低维护)l 支持SQL语句l 支持面向对象编程l 更好的性能l 轻便性(portability)l 更高的编程效率(productivity)1.3 PL/SQL 可用的SQL语句PL/SQL是Oracle系统的核心语言,现在Oracle的许多部件都是由PL/SQL写成。在PL/SQL中可以使用的SQL语句有:l 在PL/SQL中可以用的SQL语句有:INSERTUPDATEDELETESELECT INTOCOMMITROLLBACKSAVEPOINT提示:在 PL/SQL中只能用 SQL语句中的 DML 部分,不能用 DDL 部分,如果要在PL/SQL中使用DDL(如Create table 等)的话,只能以动态的方式来使用。l Oracle 的 PL/SQL 组件在对 PL/SQL 程序进行解释时,同时对在其所使用的表名、列名及数据类型进行检查。l PL/SQL 可以在SQL*PLUS 中使用。l PL/SQL 可以在高级语言中使用。l PL/SQL可以 在Oracle的 开发工具中使用。l 其它开发工具也可以调用PL/SQL编写的过程和函数,如Power Builder 等都可以调用服务器端的PL/SQL过程。1.4 PL/SQL内置包除了Oracle引擎提供环境让程序设计者根据应用要求来开发各个存储过程、函数、包及触发器外。Oracle系统本身提供了一套功能强大的内置包。这些系统包都以DBMS_开头进行命名。用这些包可以完成许多Oracle管理功能。关于Oracle内置包的详细说明请参考Oracle8I Supplied PL/SQL Packages Reference原版资料。下面是一些常用包的简单说明:l DBMS_ALERT 数据库报警,允许会话间通信;l DBMS_JOB 任务调度服务;l DBMS_LOB 大对象操作用的包;l DBMS_PIPE 数据库管道用的包;l DBMS_SQL 动态SQL所用的包;l UTL_FILE 文本文件I/O所用的包。二、PL/SQL 块结构和组成元素2.1 PL/SQL结构PL/SQL程序由三个块组成,即 声明部分、执行部分、异常处理部分。PL/SQL块的结构如下:Declare /* 声明部分: 在此 声明PL/SQL用到的变量,类型及光标 */begin /* 执行部分: 过程及SQL 语句 , 即程序的主要部分 */Exception /* 执行异常部分: 错误处理 */End;其中 执行部分是必须的。2.2 标识符PL/SQL程序设计中的标识符定义与SQL 的标识符定义的要求相同。要求和限制有:l 标识符名不能超过30字符;l 第一个字符必须为字母;l 不分大小写;l 不能用-(减号);l 不能是SQL保留字。举例1: 合法的标识符: declare v_name varchar2(20); /* 存放name 列的值 */v_sal number(9,2); /* 存放 sal 列的值 */举例2: 不合法的标识符: 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); - 非法的标识符(不能用空格)提示: 一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果.变量命名在PL/SQL中有特别的究竟,建议在系统的设计阶段就要求所有编程人员共同遵守一定的要求。使得整个系统的文档在规范上达到要求。下面是建议的命名方法:变量名 意义V_variablename 程序变量E_exceptionName自定义的异常标识T_TypeName自定义的类型P_parameterName存储过程、函数的参数变量C_ContantName用CONTANT限制的变量2.3 PL/SQL 变量类型在前面的介绍中,有系统的数据类型,也可以自定义数据类型。下表是Oracle类型和PL/SQL中的变量类型的合法使用列表:2.3.1变量类型在Oracle8i中可以使用的变量类型有:类型子类说 明范 围ORACLE限制CharCharacterStringRowidNchar定长字符串接受nls 数据032767可选,缺省=1255Varchar2VarcharStringNvarchar2可变字符串03276740002000Binary_integer带符号整数,为整数计算优化性能Number(p,s)DecDouble precisionIntegerIntNumericRealSmall int小数, Number 的子类型高精度实数整数, Number 的子类型整数, Number 的子类型与Number等价与Number等价整数, 比 integer 小Long变长字符串0-214748364732,767字节Date日期型公元前4712年1月1日至公元后4712年12月31日Boolean布尔型TRUE, FALSE,NULL不使用ROWID存放数据库行号例1.declareorder_no number(3);cust_name varchar2(20);order_date date;emp_no integer := 25; - 缺省为 25pi constant number := 3.14159;begin null;end;2.3.2复合类型(记录和表)ORACLE 在 PL/SQL 中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型-记录和表。1. 记录类型定义记录类型语法如下:TYPE record_type IS RECORD( Field1 type1 NOT NULL := exp1 , Field2 type2 NOT NULL := exp2 , . . . . . . Fieldn typen NOT NULL := expn ) ;例 :- 节选自在线代码 assign.sqlDECLARE TYPE t_rec1 type is record ( Field1 number, Field2 varchar2(5) );TYPE t_rec2 IS RECORD( Field1 number, Field2 varchar2(5);V_Rec1 t_rec1 type;V_recc1 t_rec2 type;Begin/* 赋值 (要求类型一致) */ v_rec1 := v_rec2;v_rec1.field1 := v_rec2.field1;v_rec2.field2 := v_rec2.field2;end; 可以用 select 语句对记录变量进行赋值,只要保证 记录字段与 查询结果列表中的字段相配即可。例:-节选自在线代码 select.sqlDECLARE- 用 %TYPE 类型定义与表相配的字段TYPE t_studentrecord IS RECORD(Firstname sutdents.first_name%TYPE,Lastname sutdents.last_name%TYPE,Major sutdents.major%TYPE );- 声明接收数据的变量v_stduent t_StudentRecord;Begin Select first_name,last_name,major Into v_student From students Where id=10000;End;2.3.3 使用%ROWTYPEPL/SQL 可以声明与数据库行有相同类型的记录。例:-节选自在线tabrec.sqlDECLARE TYPE t_studenttable is TABLE OF students%ROWTYPEINDEX BY BINARY_INTEGER;/* v_students 的每一元素是一个记录 */ v_students t_studentstable;Begin /* 将结果存到数组变量中 */select * into v_students(10001) from studentswhere id=10001;end;2.3.4 LOB类型Oracle提供了LOB (Large OBject)类型,用于存储大的数据对象的类型。Oracle目前主要支持BFILE, BLOB, CLOB 及 NCLOB 类型。BFILE 存放大的二进制数据对象,这些数据文件不放在数据库里,而是放在操作系统的某个目录里,数据库的表里只存放文件的目录。BLOB存储大的二进制数据类型。每个变量存储大的二进制对象的位置。大二进制的大小=4GB。CLOB存储大的字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符的大小=4GB。NCLOB存储大的NCHAR字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符的大小=4GB。2.4 运算符和表达式(数据定义)与其他语言一样,为了完成所要求的各种处理,PL/SQL需要下面各个运算符和表达式。2.4.1 关系运算符关系运算符有:运算符意义=等于, !=, =, =不等于大于=大于或等于2.4.2 一般运算符一般运算符有:运算符意义+加号-减号*乘号/除号:=赋值号=关系号.范围运算符|字符连接符2.4.3 逻辑运算符逻辑运算符有:运算符意义is null是空值Between介于两者之间In在一列值中间And逻辑与Or逻辑或Not取返,如 is not null, not in,2.6 变量赋值在PL/SQL编程中,变量赋值是一个值得注意的地方,它的语法如下: variable := expression ; variable 是一个PL/SQL变量, expression 是一个PL/SQL 表达式. 2.6.1 字符及数字运算特点l 空值加数字仍是空值:null + = nulll 空值加(连接)字符,结果为字符:null | = 2.6.2 Boolean 赋值布尔值只有TRUE, FALSE及 NULL 三个值。如:DECLAREdone BOOLEAN;the following statements are legal:BEGINdone := FALSE;WHILE NOT done LOOP.END LOOP;2.6.3 数据库赋值数据库赋值是通过 select 语句来完成的。每执行select 语句一次只能赋值一次。一般要求被赋值的变量与select 中的列名要一一对应。如:DECLAREemp_id emp.empno%TYPE;emp_name emp.ename%TYPE;wages NUMBER(7,2);BEGIN.SELECT ename, sal + commINTO emp_name, wages FROM empWHERE empno = emp_id;.END;2.6.4 可转换的类型赋值l CHAR 转换为 NUMBERT使用 TO_NUMBER 函数来完成字符到数字的转换,如:v_total := to_number(100.0) + sal;l NUMBERT 转换为CHAR使用 TO_CHAR函数可以实现 数字到字符的转换,如:v_comm := to_char(123.45) | 元 ;l 字符 转换为 日期使用 TO_DATE函数可以实现 字符到日期的转换,如:v_date := to_date(2001.07.03,yyyy.mm.dd);l 日期 转换为 字符使用 TO_CHAR函数可以实现 日期到字符的转换,如:v_to_day := to_char(sysdate,yyyy.mm.dd hh24:mi:ss) ;可以在SQL下输入下面命令来验证以上的语句:select to_char(sysdate,yyyy)|年|to_char(sysdate,mm)|月 |to_char(sysdate,dd)|日 from dual;TO_CHAR(SYSDAT-2001年07月02日SQL alter session set nls_date_format =yyyy年mm月dd日;Session altered.SQL select sysdate from dual;SYSDATE-2001年04月24日SQL select to_number(133)+200 from dual;TO_NUMBER(133)+200- 333SQL select to_char(321)|元 from dual;TO_CH-321元SQL select to_date(2001.07.03,yyyy.mm.dd) from dual;TO_DATE(2-03-7月 -012.7 变量作用范围以可见性在PL/SQL编程中,如果在变量的定义上没有做到统一的话,可能会隐藏一些危险的错误,这样的原因主要是变量的作用范围所致。与其它高级语言类似,PL/SQL的变量作用范围特点是:l 变量的作用范围是在你所引用的程序单元(块、子程序、包)内。即从声明变量开始到该块的结束。l 一个变量(标识)只能在你所引用的名字内是可见的。l 当一个变量超出了作用范围,PL/SQL引擎就释放用来存放该变量的空间(因为它可能不用了)。l 在子块中重新定义该变量后,它的作用仅在该块内。2.8 注释在PL/SQL里,可以使用两种符号来写注释,即:l 使用双 - ( 减号) 加注释PL/SQL允许用双 - - (双减号) 来写注释,它的作用范围是只能在1行有效。如:V_Sal number(12,2); - 工资变量。l 使用 /* */ 来加一行或多行注释使用 /* . . . */ 在PL/SQL程序中加,可以对多行进行注释。如:如:/*/* 文件名: stattistcs_sal.sql */* 功能:统计整个部门工资 */* 作者: 张三 */* 修改日期 :2001.07.03 */*/或/* 文件名: stattistcs_sal.sql 功能:统计整个部门工资 作者: 张三 修改日期 :2001.07.03 */2.9 简单例子在我们给出编写PL/SQL程序所需的各个语句之前,先给出一些简单的例子,目的是让读者对PL/SQL程序先有个感性认识。2.9.1 简单数据插入例子/* 本例子仅是一个简单的插入,不是实际应用。 */declare v_ename varchar2(20) := 张三;v_sal number(7,2) :=1234.56;v_deptno number(2) := 10;v_empno number(4) := 8888;begininsert into emp ( empno, ename, JOB, sal, deptno , hiredate ) values ( v_empno, v_ename, 自由职业, v_sal, v_deptno, to_date(1954.06.09,yyyy.mm.dd) );commit;end;/show error2.9.2 简单数据删除例子/* 本例子仅是一个简单的删除例子,不是实际应用。 */declare v_ename varchar2(20) := 赵元杰;v_empno number(4) := 8888;begindelete from emp where empno=v_empno and ename=v_ename;commit;end;/show error三、PL/SQL 处理流程在PL/SQL程序中,要使程序能按照逻辑进行处理,除了有些语句是SQL语句外,还必须有能进行逻辑控制的语句。下面就介绍进行处理流程的语句结构。3.1条件语句IF THENPL/SQL 和 SQL语句END IF;IF THENPL/SQL 和 SQL语句ELSE其它语句END IF;IF THENPL/SQL 和 SQL语句ELSIF THEN其它语句END IF;例:-节选自在线代码 if1.sqlDECLARE V_numberseats rooms.number_seats%TYPE; V_comment varchar2(35);Degin Select number_seats into v_numberseats From rooms where room_id=99999; IF v_numberseats50 then V_comment := Fairly small; Elsif v_numberseats 50 then Exit; End if ; End loop;End;例 3.-节选自在线代码 exitwhen.sqlDECLARE V_counter binary_index := 1;Begin Loop Insert into temp_table Values ( v_counter, loop index ); Exit when v_counter 50 ; End loop;End;3.2.2 WHILE 循环While 循环While loop 要执行的语句; end loop;例1.declare x number; begin x:= 1; while x10 loop dbms_output.put_line(to_char(x)|还小于10); x:= x+1; end loop; end;例 2.-节选自在线代码 while1.sqlDECLARE V_counter binary_integer := 1;Begin While v_counter = 50 loop Inert into temp_table Values( v_counter, loop index ) ; V_counter := v_counter + 1; End loop;End;3.2.3 数字式循环For 循环For 循环计数器 in 下限 . 上限 loop 要执行的语句;end loop;FOR loop_counter IN REVERSE low
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年合肥滨湖时光文化旅游投资有限公司招聘3人考前自测高频考点模拟试题附答案详解
- 安全培训补助课件
- 涂装前处理知识培训课件
- 2025年湖南邵阳市农村产权交易中心有限公司招聘合同制员工模拟试卷附答案详解(突破训练)
- 2025汾西矿业井下操作技能人员招聘300人(山西)模拟试卷及1套完整答案详解
- 2025江西中小学教师招聘考试南昌考区模拟试卷附答案详解(黄金题型)
- 涂料应用知识培训课程
- 安全培训脱臼课件
- 2025江苏连云港市赣榆农业发展集团有限公司及下属子公司招聘设备工程师岗(A36)技能考前自测高频考点模拟试题附答案详解(模拟题)
- 安全培训职责分工表格课件
- 抖音超火看表情符号猜成语课件
- 曾奇峰精神分析初级50讲讲义
- 卡尔曼(Kalman)滤波课件
- 《中国少数民族音乐》教学设计
- 非居民金融账户涉税信息尽职调查管理办法专题培训广州课件
- 科技法庭使用手册汇总
- 生态系统服务功能PPT通用课件
- 红色卡通风小学生大队委竞选PPT模板
- 研究生学籍登记表
- 运动障碍患者的护理
- 泰国英文介绍
评论
0/150
提交评论