第10章 PL_SQL编程语言1_第1页
第10章 PL_SQL编程语言1_第2页
第10章 PL_SQL编程语言1_第3页
第10章 PL_SQL编程语言1_第4页
第10章 PL_SQL编程语言1_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据库开发技术数据库开发技术福建工程学院第10章 PL/SQL编程基础1数据库开发技术FJUT 本章要点本章要点编写编写PL/SQLPL/SQL匿名块匿名块声明声明PL/SQL PL/SQL 变量、常量、数据类型变量、常量、数据类型介绍赋值语句和算术运算符介绍赋值语句和算术运算符理解理解%TYPE%TYPE属性属性掌握各种变量的范围和使用掌握各种变量的范围和使用如何在如何在PL/SQLPL/SQL块中编写可执行的代码块中编写可执行的代码 掌握掌握DBMS_OUTPUTDBMS_OUTPUT包与输入输出包与输入输出嵌套块应遵循的规则嵌套块应遵循的规则 准备编写简单的准备编写简单的PL/SQLPL

2、/SQL块块数据库开发技术FJUT什么是什么是PL/SQL PL/SQL(Procedural language/SQL)是过程语言是过程语言(Procedural Language)与结构化查询语言与结构化查询语言(SQL)结合而结合而成的编程语言。成的编程语言。 PL/SQL 是对是对 SQL 的扩展的扩展 PL/SQL支持现代软件工程的很多重要特征,支持现代软件工程的很多重要特征, 如如: 数据封装、面向对象编程(数据封装、面向对象编程(OOP)、错误(例外)处、错误(例外)处理和信息隐藏等。理和信息隐藏等。 PL/SQL是一种是一种“后台技术后台技术”,它的输入输出是面向,它的输入输出

3、是面向 数据库的,主要用于编写服务器端的程序。数据库的,主要用于编写服务器端的程序。数据库开发技术FJUT什么是什么是PL/SQL 支持多种数据类型,如大对象和集合类型,可使用条件和支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构,给循环等控制结构,给SQL语句的执行添加程序逻辑。语句的执行添加程序逻辑。 PL/SQL是是Oracle数据库的核心编程语言,用于编数据库的核心编程语言,用于编 写存储过程、函数、触发器、包,面向对象数据库的写存储过程、函数、触发器、包,面向对象数据库的 类的定义等等。类的定义等等。 与与 Oracle 服务器和服务器和 Oracle 工具紧密集成,

4、具备可移植工具紧密集成,具备可移植性、灵活性和安全性。性、灵活性和安全性。数据库开发技术FJUTPL/SQL简介简介支持支持 SQL,在,在 PL/SQL 中可以使用:中可以使用:数据操纵命令数据操纵命令事务控制命令事务控制命令游标控制游标控制SQL 函数和函数和 SQL 运算符运算符可移植性,可运行在任何操作系统和平台上的可移植性,可运行在任何操作系统和平台上的Oralce 数据库数据库更佳的性能,更佳的性能,PL/SQL 经过编译执行经过编译执行安全性,可以通过存储过程限制用户对数据的访问安全性,可以通过存储过程限制用户对数据的访问用户将整个语句块发送给 OracleOracleProce

5、dureBegin ProcedureCall SQL Command End数据库开发技术FJUTPL/SQL 简介简介PL/SQL 引擎驻留在引擎驻留在 Oracle 服务器中服务器中该引擎接受该引擎接受 PL/SQL 块并对其进行编译执行块并对其进行编译执行将PL/SQL 块发送给 Oracle 服务器用户用户执行过程语句引擎将 SQL 语句发送给SQL 语句执行器Oracle 服务器PL/SQL引擎引擎SQL 语句执行器过程语句过程语句执行器执行器执行 SQL 语句将结果发送给用户数据库开发技术FJUTPL/SQL基本原理基本原理PL/SQL程序中可以使用大写或小写字母程序中可以使用大

6、写或小写字母一个完整的语句可以占若干行,但关键字不能被分开写在两一个完整的语句可以占若干行,但关键字不能被分开写在两行。行。PL/SQL语句包括保留字,标识符,定界符,字面值和注释语句包括保留字,标识符,定界符,字面值和注释保留字保留字(关键字):专门用途的单词(关键字):专门用途的单词用户定义标识符:用来命名变量、常量、过程、函数、游用户定义标识符:用来命名变量、常量、过程、函数、游标、表、记录和异常。标、表、记录和异常。字面值:数字类型,字符类型和布尔类型字面值:数字类型,字符类型和布尔类型注释:注释:对每个代码段的目的和用途的描述对每个代码段的目的和用途的描述数据库开发技术FJUTPL/

7、SQL 块的语法和原则块的语法和原则标识符标识符至多有至多有30个字符个字符允许使用字母允许使用字母,数字数字,$,#,_不能是保留字,但若保留字用双引号标明,不能是保留字,但若保留字用双引号标明,即可作为标识符(例如,即可作为标识符(例如,SELECT)。必须以字母开头必须以字母开头不允许与数据库中表的列名相同不允许与数据库中表的列名相同保留字应为大写形式,以提高可读性。保留字应为大写形式,以提高可读性。数据库开发技术FJUTPL/SQL 块的语法和原则块的语法和原则字面值字面值 字面值是精确的数值、字符、串或布尔值。字面值是精确的数值、字符、串或布尔值。 字符或日期型文字必须用单引号标识。

8、字符或日期型文字必须用单引号标识。 数字可以是简单的值数字可以是简单的值(如如, 32.5) ,也可是用科学计,也可是用科学计数法表示的数值数法表示的数值(如如, 2E5, 意义意义2*105= 200000) 。v_ename := Henderson;数据库开发技术FJUT注释注释在单行注释前加前缀双短线在单行注释前加前缀双短线 (- -)。多行注释放在多行注释放在 /* 和和 */之间。之间。举例:用月工资计算年工资举例:用月工资计算年工资.SET SERVEROUTPUT ON DECLARE v_sal NUMBER(9,2);BEGIN /* Compute the annual

9、salary based on the monthly salary input from the user */ v_sal := &monthly_sal * 12; DBMS_OUTPUT.PUT_LINE(The annual salary is |TO_CHAR(v_sal);END; - This is the end of the block/ 数据库开发技术FJUT在在PL/SQL中显示输出结果中显示输出结果vDBMS_OUTPUTDBMS_OUTPUT是是OracleOracle提供的包提供的包vDBMS_OUTPUTDBMS_OUTPUT包为包为PL/SQLPL/S

10、QL程序提供了对一个内部缓冲区的输程序提供了对一个内部缓冲区的输入输出功能入输出功能vDBMS_OUTPUTDBMS_OUTPUT包中的过程实现了两个基本操作:包中的过程实现了两个基本操作:GET GET 和和 PUTPUTvPUTPUT操作是将过程参数中的数据放入到一个内部缓冲区中,操作是将过程参数中的数据放入到一个内部缓冲区中,而而GETGET操作则是从这个缓冲区中读出数据,并将其内容作为操作则是从这个缓冲区中读出数据,并将其内容作为参数值返回参数值返回DBMS_OUTPUT包与输入输出包与输入输出数据库开发技术FJUT在在PL/SQL中显示输出结果中显示输出结果v要使用该方法显示输出数据

11、,必须将环境变量作如下的设置: SET SERVEROUTPUT ON vDBMS_OUTPUT.PUT(字符串表达式);用于输出字符串,但不换行,括号中的参数是要输出的字符串表达式。用于输出字符串,但不换行,括号中的参数是要输出的字符串表达式。vDBMS_OUTPUT.PUT_LINE(字符串表达式);用于输出一行字符串信息,并换行,括号中的参数是要输出的字符串表用于输出一行字符串信息,并换行,括号中的参数是要输出的字符串表达式。达式。vDBMS_OUTPUT.NEW_LINE;用来输出一个换行,没有参数。用来输出一个换行,没有参数。 DBMS_OUTPUT包与输入输出包与输入输出数据库开发

12、技术FJUT注释、替换变量与注释、替换变量与DBMS_OUTPUT包使用实例包使用实例SET SERVEROUTPUT ONDECLARE v_sal NUMBER(9,2);BEGIN /* SQL中的替换变量在中的替换变量在PL/SQL中仍然有效中仍然有效 */ v_sal:= &monthly_sal*12;-不需要在程序块中声明替换变量不需要在程序块中声明替换变量 DBMS_OUTPUT.PUT_LINE(The annual salary is | TO_CHAR(v_sal);END;/以下程序只能在以下程序只能在sql-plus环境中运行环境中运行数据库开发技术FJUTP

13、L/SQL中的中的SQL函数函数过程语句中的有效函数过程语句中的有效函数:单行数字单行数字 单行字符单行字符数据类型转换数据类型转换日期日期过程语句中的无效函数过程语句中的无效函数:DECODE分组函数。分组函数仅在分组函数。分组函数仅在PL/SQL块中的块中的SQL语句中适用。语句中适用。与与 SQL中同中同 数据库开发技术FJUTPL/SQL 函数函数PL/SQL 提供了大量的有效函数用来处理数据,这些函数提供了大量的有效函数用来处理数据,这些函数有以下几类:有以下几类:l 错误报告函数(错误报告函数(Error reporting)l 数字函数(数字函数(Number)l 字符函数(字符

14、函数(Character)l 转换函数(转换函数(Conversion)l 日期函数(日期函数(Date)l 杂项函数(杂项函数(Miscellaneous)数据库开发技术FJUTPL/SQL 函数函数例:给一个公司创建一个通信地址.把员工名转换成小写形式.v_mailing_address := v_name|CHR(10)| v_address|CHR(10)|v_state| CHR(10)|v_zip;v_ename:= LOWER(v_ename);注解:注解:CHR 是一个SQL函数,把ASCII码转换成相应的字符-。数据库开发技术FJUT数据类型转换函数数据类型转换函数把数据转换

15、成可比较的数据类型。把数据转换成可比较的数据类型。混合的数据类型可能会出现错误,影响性能混合的数据类型可能会出现错误,影响性能转换函数转换函数:TO_CHARTO_DATETO_NUMBERDECLARE v_date VARCHAR2(15);BEGIN SELECT TO_CHAR(hiredate, MON. DD, YYYY) INTO v_date FROM emp WHERE empno = 7839;END;数据库开发技术FJUT数据类型转换函数数据类型转换函数l如果variable v_date 被声明为DATE型,该语句就会产生一个编译错误。v_date := January

16、 13, 1998; v_date := TO_DATE (January 13, 1998, Month DD, YYYY);l使用TO_DATE 转换函数可改正错误。数据库开发技术FJUTPL/SQL 块结构块结构DECLARE 可选可选变量、游标、例外声明变量、游标、例外声明用户自定义的特殊类型用户自定义的特殊类型BEGIN 必须必须SQL 语句语句PL/SQL 语句语句EXCEPTION 可选可选错误发生时的处理动作错误发生时的处理动作END; 必须必须DECLAREBEGINEXCEPTIONEND;PL/SQL是块结构化语言是块结构化语言,即程序能被分成若干个逻辑块。愉中即程序能被

17、分成若干个逻辑块。愉中对象有自己的作用域。对象有自己的作用域。一个一个PL/SQL块有三个部分构成:声明(可选)块有三个部分构成:声明(可选),执行执行(必须必须) 和和 异常处理异常处理 (可选可选)。数据库开发技术FJUT可选的可选的该部分给出当在执行部分发生错误该部分给出当在执行部分发生错误或出现异常情况或出现异常情况时的具体处理动作时的具体处理动作 。可嵌套块。可嵌套块。异常处理异常处理部分部分必须的必须的 该部分包括该部分包括SQL语句(用于处理数语句(用于处理数据库中的数据)及据库中的数据)及PL/SQL语句(用语句(用于处理块中的数据)。于处理块中的数据)。可嵌套块。可嵌套块。执

18、行部分执行部分可选的可选的该部分包括所有在声明、执行部分该部分包括所有在声明、执行部分所用到的变量、常量、游标以及用所用到的变量、常量、游标以及用户自定义的特殊类型。户自定义的特殊类型。声明部分声明部分备注备注描述描述块结构块结构PL/SQL 块结构块结构数据库开发技术FJUTPL/SQL 块结构块结构DECLARE v_variable VARCHAR2(5);BEGIN SELECT column_name INTO v_variable FROM table_name;EXCEPTION WHEN exception_name THEN .END;数据库开发技术FJUTPL/SQL 块结

19、构块结构PL/SQL 块是构成块是构成 PL/SQL 程序的基本单元程序的基本单元将逻辑上相关的声明和语句组合在一起将逻辑上相关的声明和语句组合在一起 写一个简单的写一个简单的PL/SQL过程过程,输出输出Hello World!set serveroutput onbegin dbms_output.put_line(Hello World!);end;/当该块成功执行,没有任何未经处理的错误和编译错误时,将会显示如下语当该块成功执行,没有任何未经处理的错误和编译错误时,将会显示如下语句句 :PL/SQL 过程已成功完成。过程已成功完成。PL/SQL procedure successful

20、ly completed 数据库开发技术FJUT数据库开发技术FJUT数据库开发技术FJUT块包括两种类型:匿名块和命名块块包括两种类型:匿名块和命名块匿名块匿名块匿名块是没有被命名的块。他们是在应用程序即将执行时匿名块是没有被命名的块。他们是在应用程序即将执行时被声明,在运行期间被传递给被声明,在运行期间被传递给PL/SQL引擎执行。引擎执行。命名块命名块子程序是被命名的子程序是被命名的 PL/SQL 块,能接收参数,能被调用块,能接收参数,能被调用。子程序存储在服务器或应用程序层中。子程序存储在服务器或应用程序层中。它可以声明为过程它可以声明为过程(procedure)也可以为函数也可以为

21、函数(function),通常仅执行一动作时定义为过程,计算值时定义为函数,通常仅执行一动作时定义为过程,计算值时定义为函数。包。包(package)是由一组过程和函数组成。触发器是由一组过程和函数组成。触发器(trigger)是由是由DML语句以隐含方式调用的一个块。语句以隐含方式调用的一个块。附注:函数类似于过程,只是函数必须返回一个值。附注:函数类似于过程,只是函数必须返回一个值。 块的类型块的类型数据库开发技术FJUT块的类型块的类型匿名块匿名块 过程过程 函数函数数据库开发技术FJUT程序结构程序结构数据库开发技术FJUTDeveloper/2000组件组件-例如,表单例如,表单PL

22、/SQL块,与应用程序有关;能块,与应用程序有关;能自动执行。自动执行。应用程序应用程序触发器触发器Oracle服务器服务器PL/SQL块,与数据库中的表有关块,与数据库中的表有关;由;由DML语句触发,自动执行。语句触发,自动执行。数据库数据库触发器触发器Oracle服务器和服务器和Developer/2000组件组件-例如,表单例如,表单有命名的有命名的PL/SQL模块,是一组相模块,是一组相关的过程、函数和标识符。关的过程、函数和标识符。包包Developer/2000组件组件-例如,表单例如,表单有命名的有命名的PL/SQL块,存储在块,存储在Developer/2000应用程序中或被

23、应用程序中或被库共享;可通过名字被重复调用。库共享;可通过名字被重复调用。应用程序中的应用程序中的过程过程/函数函数Oracle服务器服务器有命名的有命名的PL/SQL块;存储在块;存储在Oracle服务器中;能接受参数;可服务器中;能接受参数;可通过名字被重复调用。通过名字被重复调用。已存储的已存储的过程过程/函数函数所有所有PL/SQL环境环境未被命名的未被命名的PL/SQL块;可嵌入到块;可嵌入到应用程序中亦可交互使用。应用程序中亦可交互使用。匿名块匿名块适用性适用性描述描述程序结构程序结构数据库开发技术FJUTTRUE变量类型 P20025-OCT-99Atlanta“Four sco

24、re and seven years agoour fathers brought forth uponthis continent, a new nation,conceived in LIBERTY, and dedicatedto the proposition that all menare created equal.”256120.08数据库开发技术FJUTPL/SQl数据类型和操作符PL/SQL 支持的内置数据类型支持的内置数据类型数据类型数据类型引用类型%ROWTYPE标量类型数字字符布尔型日期时间LOB类型BFILEBLOBCLOBNCLOB%TYPE提供某个变量或数据库表列

25、的数据类型提供表示表中一行的记录类型 复合类型数据库开发技术FJUTPL/SQl数据类型和操作符数据类型和操作符指定数值的存储格式指定数值的存储格式BINARY_INTEGER(-231=1231-1)INTEGERINTSMALLINTPOSTIVE 0231 不能为空NATURAL 1231 不能为空PLS_INTEGERNUMBERDEC(定点数)DECIMAL (定点数)NUMERIC (定点数)FLOAT (浮点数)REAL (浮点数)DOUBLE PRECISION (浮点数)数据库开发技术FJUTPL/SQl数据类型和操作符数据类型和操作符字符数据类型包括:字符数据类型包括:CH

26、ARVARCHAR2LONGRAWLONG RAWPL/SQL 的数据类型与的数据类型与 SQL数据类型的比较数据类型的比较数据类型数据类型SQL类型类型PL/SQL类型类型CHAR1.20001.32767LONG1.2GB1.32760LONG RAW1.2GB1.32760RAW1.20001.32767VARCHAR21.40001.32767数据库开发技术FJUTPL/SQl数据类型和操作符数据类型和操作符用于引用数据库列的数据类型,以及表示表中一行用于引用数据库列的数据类型,以及表示表中一行的记录类型的记录类型属性类型有两种:属性类型有两种:%TYPE - 引用变量和数据库列的数据

27、类型引用变量和数据库列的数据类型%ROWTYPE - 提供表示表中一行的记录类型提供表示表中一行的记录类型使用属性类型的优点:使用属性类型的优点:不需要知道被引用的表列的具体类型不需要知道被引用的表列的具体类型如果被引用对象的数据类型发生改变,如果被引用对象的数据类型发生改变,PL/SQL 变量的数据类型也随之改变变量的数据类型也随之改变bh emp.empno%TYPE;emp_rec scott.emp%ROWTYPE;数据库开发技术FJUT变量的使用变量的使用 PL/SQL 中可以声明变量,继而在中可以声明变量,继而在SQL中使用它们,中使用它们,也可在任一过程语句的表达式中使用。也可在

28、任一过程语句的表达式中使用。数据的临时存储数据的临时存储l在数据流过程执行之前需输入合法的数据,这些在数据流过程执行之前需输入合法的数据,这些数据将被暂时存放在一个或多个变量中。数据将被暂时存放在一个或多个变量中。对其值的操作对其值的操作l无须访问数据库,通过变量就可进行计算和对其无须访问数据库,通过变量就可进行计算和对其他数据操作。他数据操作。 重复使用重复使用l 变量一经声明,就可在应用程序中重复使用。简变量一经声明,就可在应用程序中重复使用。简单地通过引用,其他语句(包括其他的声明语句单地通过引用,其他语句(包括其他的声明语句)即可重复使用这些变量。)即可重复使用这些变量。易于维护易于维

29、护 数据库开发技术FJUTPL/SQL变量定义变量定义PL/SQL 块中可以使用变量和常量块中可以使用变量和常量在声明部分声明,使用前必须先声明在声明部分声明,使用前必须先声明声明时必须指定数据类型,每行声明一个标识符声明时必须指定数据类型,每行声明一个标识符在可执行部分的在可执行部分的 SQL 语句和过程语句中使用语句和过程语句中使用声明变量和常量的语法:声明变量和常量的语法:给变量赋值有两种方法:给变量赋值有两种方法:使用赋值语句使用赋值语句 :=使用使用 SELECT INTO 语句语句数据库开发技术FJUTPL/SQL中的变量的操作中的变量的操作在声明部分声明并初始化变量。在声明部分声

30、明并初始化变量。在执行部分为变量指派新值。在执行部分为变量指派新值。通过参数把值传递给通过参数把值传递给PL/SQL块。块。通过输出变量显示结果。通过输出变量显示结果。作用:变量主要用于程序与数据库之间的数据作用:变量主要用于程序与数据库之间的数据交换以及保存程序的中间结果。交换以及保存程序的中间结果。数据库开发技术FJUT变量的类型变量的类型PL/SQL变量变量标量型标量型复合型复合型引用型引用型LOB型型 (大型的对象大型的对象)外部变量外部变量绑定变量和主变量绑定变量和主变量主要的标量数据类型: VARCHAR2 (最大长度) NUMBER (精度, 刻度) DATE CHAR (最大长

31、度) LONG LONG RAW BOOLEAN BINARY_INTEGER PLS_INTEGER数据库开发技术FJUT声明声明 PL/SQL 变量变量identifier CONSTANT datatype NOT NULL := | DEFAULT expr;Declare v_hiredateDATE; v_deptnoNUMBER(2) NOT NULL := 10; v_locationVARCHAR2(13) := Atlanta; c_ commCONSTANT NUMBER := 1400; 数据库开发技术FJUT声明声明 PL/SQL变量变量 规则规则 遵循命名的惯例。遵

32、循命名的惯例。 可以按习惯命名可以按习惯命名例如例如 v_name 代表一个变量和代表一个变量和 c_name代表一个常变量代表一个常变量, g_ 代表代表 global 变量。变量。 初始化初始化NOT NULL型变量。型变量。 用赋值操作符用赋值操作符(:=) 或用或用DEFAULT关键字给变量赋初始值。关键字给变量赋初始值。 每行至多声明一个标识符。每行至多声明一个标识符。 声明常量时,必须在类型说明符之前标明关键字声明常量时,必须在类型说明符之前标明关键字CONSTANT ,并给该常量赋初值。并给该常量赋初值。数据库开发技术FJUT命名规则命名规则不同块中的两个变量可以同名。不同块中的

33、两个变量可以同名。变量的名字(标识符)不能与块中表的列同变量的名字(标识符)不能与块中表的列同名。名。DECLARE empnoNUMBER(4);BEGIN SELECT empno INTO empno FROMemp WHERE ename = SMITH;END;数据库开发技术FJUT变量的赋值变量的赋值v_ename := Maduro;v_hiredate := 31-DEC-98;identifier := expr;数据库开发技术FJUT变量的初始化和关键字变量的初始化和关键字使用使用:= (赋值操作符)(赋值操作符)DEFAULT(缺省)(缺省)NOT NULL(非空)(非空

34、)数据库开发技术FJUT标量类型标量类型l仅有一个值l内部没有分量25-OCT-99Atlanta“Four score and seven years ago our fathers brought forth upon this continent, a new nation, conceived in LIBERTY, and dedicated to the proposition that all men are created equal.”TRUE256120.08数据库开发技术FJUT基本标量类型基本标量类型VARCHAR2 (最大长度最大长度)NUMBER (精度精度, 刻度

35、刻度)DATECHAR (最大长度最大长度)LONGLONG RAWBOOLEANBINARY_INTEGERPLS_INTEGER数据库开发技术FJUT数据类型数据类型描述描述VARCHAR2(最大长度最大长度)变长字符的基本类型,最大的存储数据是变长字符的基本类型,最大的存储数据是32767字节。字节。 VARCHAR2型的变量和常量没有默认的长度。型的变量和常量没有默认的长度。NUMBER (精度精度, 刻度刻度)整数和浮点数的基本类型。整数和浮点数的基本类型。DATE日期和时间的基本类型。日期和时间的基本类型。DATE类型来存储包含从一天的午夜开始的类型来存储包含从一天的午夜开始的定长

36、的时间。有效的时间范围是从公元前定长的时间。有效的时间范围是从公元前4712年年1月月1号开始到号开始到公元公元9999年年12月月31号。号。CHAR (最大长度最大长度)固定长度字符数据的基本类型,最大有固定长度字符数据的基本类型,最大有32767字节。如果没有指定字节。如果没有指定的最大值,缺省值为的最大值,缺省值为1。LONG变长字符串的基本类型,最大长度是变长字符串的基本类型,最大长度是32760字节。字节。LONG型的数据型的数据库列的最大长度是库列的最大长度是2147483647字节。字节。LONG RAW二进制数据和字节字符串的基本类型,最大字节为二进制数据和字节字符串的基本类

37、型,最大字节为32760。PL/SQL不能解释不能解释 LONG RAW 型的数据。型的数据。BOOLEAN存储逻辑值存储逻辑值TRUE、FALSE和和 NULL 的基本类型。的基本类型。BINARY_INTEGER介于介于-2147483647和和2147483647之间有符号整数的基本类型。之间有符号整数的基本类型。与与NUMBER相比,相比,BINARY_INTEGE占有较少的存储空间占有较少的存储空间PLS_INTEGER介于介于-2147483647和和2147483647之间有符号整数的基本类型。之间有符号整数的基本类型。与与NUMBER 和和 BINARY_INTEGER相比,相

38、比,PLS_INTEGER占有占有较少的存储空间且运行效率高。较少的存储空间且运行效率高。数据库开发技术FJUT标量型变量的声明标量型变量的声明v_jobVARCHAR2(9);v_countBINARY_INTEGER := 0;v_total_salNUMBER(9,2) := 0;v_orderdateDATE := SYSDATE + 7;c_tax_rateCONSTANT NUMBER(3,2) := 8.25;v_validBOOLEAN NOT NULL := TRUE;举例数据库开发技术FJUT变量常量声明、初始化和赋值变量常量声明、初始化和赋值DECLARE V_A1 NU

39、MBER; V_A2 NUMBER NOT NULL :=2000; V_A3 CONSTANT NUMBER :=3000; V_A4 CONSTANT NUMBER DEFAULT 4000; V_A5 NUMBER; BEGIN V_A1:=1000; SELECT SAL INTO V_A5 FROM EMP WHERE EMPNO=7876; INSERT INTO T VALUES(V_A1); INSERT INTO T VALUES(V_A2); INSERT INTO T VALUES(V_A3); INSERT INTO T VALUES(V_A4); INSERT INT

40、O T VALUES(V_A5); END;/ 变量不可以与块中涉及的列同名 变量声明在DECLARE之后; 变量声明时如果不赋值,其值为NULL; 变量声明时如果设置为NOT NULL, 则一定要在声明时使用“:=”或者 “DEFAULT”赋初值。 变量在程序体中可以用“:=”或者 “SELECT INTO”赋值 常量声明时一定要赋值,在程序中只能 引用,不能修改数据库开发技术FJUT数据库开发技术FJUT数据库开发技术FJUT%TYPE 的属性的属性声明的变量对应于声明的变量对应于: 数据库的列数据库的列其它先前声明过的变量其它先前声明过的变量在在 %TYPE前缀上前缀上:数据库中表和列名

41、数据库中表和列名先前声明过的变量名先前声明过的变量名优点:优点: 利于书写和维护代码利于书写和维护代码, 因为不必要因数据库中列的修改而因为不必要因数据库中列的修改而去修改去修改PL/SQL块。块。 能和表中列的数据类型保持一致能和表中列的数据类型保持一致 可以与先前声明过的变量保持一致可以与先前声明过的变量保持一致数据库开发技术FJUT用用%TYPE声明变量声明变量举例举例. v_enameemp.ename%TYPE; v_balanceNUMBER(7,2); v_min_balancev_balance%TYPE := 10;.数据库开发技术FJUT声明布尔型变量声明布尔型变量布尔型变

42、量仅有三个值布尔型变量仅有三个值TRUE、FALSE和和NULL.布尔型变量由逻辑运算符布尔型变量由逻辑运算符AND、 OR和和NOT连接连接.布尔型变量输出三个值布尔型变量输出三个值 TRUE、 FALSE或或 NULL.算术、字符和日期表达式可以返回一个布尔值。算术、字符和日期表达式可以返回一个布尔值。数据库开发技术FJUT 复合类型复合类型类型类型PL/SQL 表表 (tables)PL/SQL 记录记录 (records)PL/SQL 可变数组可变数组 (varrays)数据库开发技术FJUTLOB 型变量型变量数据库开发技术FJUT键盘输入键盘输入(替换变量替换变量)键盘输入是通过在

43、变量名前面加一个键盘输入是通过在变量名前面加一个“&”符号实现符号实现的,如:的,如:&V_INPUT。如果此变量是数值型(如:。如果此变量是数值型(如:number,integer等),在提示输入时直接输入数等),在提示输入时直接输入数据;如果此变量是字符型(如:据;如果此变量是字符型(如:varchar2()等),等),有两个办法输入:有两个办法输入:如果书写时是:如果书写时是:&V_INPUT,那么输入时要加单引,那么输入时要加单引号号“”把字符串引起来;把字符串引起来;如果书写时是:如果书写时是:&V_INPUT,那么输入时不要加,那么输入时不要加单引号

44、,直接输入字符串。单引号,直接输入字符串。数据库开发技术FJUT外部变量外部变量(绑定变量绑定变量)Server外部变量是在某一程序的主环境下声明的一种变量,用来外部变量是在某一程序的主环境下声明的一种变量,用来把运行时的值(可以是数字、字符)传入或传出一个或把运行时的值(可以是数字、字符)传入或传出一个或更多更多PL/SQL程序,在这个程序中可以像其他变量一样程序,在这个程序中可以像其他变量一样使用外部变量。在主环境或一个调用环境(可以是由过使用外部变量。在主环境或一个调用环境(可以是由过程、函数或包的程、函数或包的PL/SQL语句调用的)下,声明外部变语句调用的)下,声明外部变量,之后就可

45、引用这些外部变量了。量,之后就可引用这些外部变量了。数据库开发技术FJUT外部变量外部变量(绑定变量绑定变量) 外部变量是在程序运行的主环境中定义的变量外部变量是在程序运行的主环境中定义的变量 在在PL/SQL中引用外部变量需要在外部变量前加中引用外部变量需要在外部变量前加”:” 在在PL/SQL中可以象使用自己的变量一样使用外部变量。中可以象使用自己的变量一样使用外部变量。 外部变量使得外部变量使得PL/SQL可以与主机环境之间传递数据可以与主机环境之间传递数据 应尽量减少使用外部变量,因为他会影响性能。为了尽量减应尽量减少使用外部变量,因为他会影响性能。为了尽量减少对主机的呼叫,可以将变量

46、的值赋给局部变量。少对主机的呼叫,可以将变量的值赋给局部变量。数据库开发技术FJUT引用外部变量引用外部变量SQL VARIABLE emp_num NUMBER -定义定义SQL*PLUS中的变量中的变量SQL BEGIN 2 SELECT COUNT(*) INTO :emp_num 3 FROM emp; 4 END; 5 /PL/SQL 过程已成功完成。过程已成功完成。SQL PRINT emp_num -在在SQL*PLUS中显示变量中显示变量 EMP_NUM- 13在SQL*PLUS环境中:数据库开发技术FJUT嵌套块和变量的作用域嵌套块和变量的作用域只要可执行的语句能运行,其所在

47、的块就能只要可执行的语句能运行,其所在的块就能被嵌套。被嵌套。一个嵌套块可看作是一个语句。一个嵌套块可看作是一个语句。异常处理部分可以包含若干嵌套块。异常处理部分可以包含若干嵌套块。一个对象的作用域是指所涉及到该对象的程一个对象的作用域是指所涉及到该对象的程序的区域。序的区域。数据库开发技术FJUT嵌套块和变量的作用域嵌套块和变量的作用域一个标识符只有在它的作用域中用一个不限定一个标识符只有在它的作用域中用一个不限定的名字来引用时才是可见的的名字来引用时才是可见的:块可以由内向外查找标识符。块可以由内向外查找标识符。 (如在嵌套块如在嵌套块的父块中的声明部分进行查找的父块中的声明部分进行查找)

48、块不可以由外向内查找标识符。块不可以由外向内查找标识符。(如不会向如不会向内在其子块或其兄弟块中查找)内在其子块或其兄弟块中查找)附注附注: 可以使用块标签作为前缀限定一个标识符。数据库开发技术FJUT嵌套块和变量的作用域嵌套块和变量的作用域. x BINARY_INTEGER;BEGIN . DECLARE y NUMBER; BEGIN . END; .END; x的范围的范围Y的范围的范围举例举例数据库开发技术FJUT决定变量的作用域决定变量的作用域本课习题本课习题.DECLARE V_SALNUMBER(7,2) := 60000; V_COMMNUMBER(7,2) := V_SAL

49、 * .20; V_MESSAGEVARCHAR2(255) := eligible for commission;BEGIN . DECLARE V_SALNUMBER(7,2) := 50000; V_COMM NUMBER(7,2) := 0; V_TOTAL_COMPNUMBER(7,2) := V_SAL + V_COMM; BEGIN . V_MESSAGE := CLERK not|V_MESSAGE; END; V_MESSAGE := SALESMAN|V_MESSAGE;END;习题1. 子块中的 V_MESSAGE.2. 主块中的 V_TOTAL_COMP.3. 子块中的 V_COMM .4. 主块中的 V_COMM.5. 主块中的V_MESSAGE .数据库开发技术FJUTPL/SQL中的运算符中的运算符逻辑运算符逻辑运算符算术运算符算术运算符连接运算符连接运算符 控制运算符次序的括号控制运算符次序的括号求幂运算符求幂运算符 (*)与与SQL中同中同数据库开发技术

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论