- 浏览: 524973 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (740)
- css (4)
- jquery (8)
- javascript (23)
- html (0)
- uml (0)
- 设计模式 (1)
- 开发工具 (14)
- json (4)
- struts 1.x (3)
- spring (3)
- hibernate (6)
- struts 2.x (17)
- JFreechart (0)
- j2se (48)
- jsp (9)
- flex (22)
- 找工作 (1)
- 技术杂谈 (18)
- 网络编程 (5)
- io流 (1)
- ORACLE (15)
- 报表 (3)
- extjs (11)
- jpbm (2)
- swing (5)
- jspereports (3)
- sql (1)
- linux (15)
- ps (1)
- storm (4)
- hbase (8)
- li (0)
- python (1)
- hive (3)
- 机器学习 (1)
- hdfs (1)
- elasticsearch (1)
- hadoop 2.2 (5)
- hadoop (1)
最新评论
-
Tristan_S:
这个有点意思
ASM -
starryskydog:
程序修改detail band部分的样式 如内容字体大小 ...
使用jasperReport实现动态表头 -
samwong:
Good, so usefule
使用YUI Compressor压缩CSS/JS -
gc715409742:
能够告诉我怎么在web项目中使用YUI Compressor? ...
使用YUI Compressor压缩CSS/JS -
JsonTeye:
您好! 我看你的代码,我现在也在做动态报表,实现功能由用户自己 ...
使用jasperreport动态生成pdf,excel,html
oracle PL/SQL的基本构成,块结构和基本语法要求,数据类型,变量定义,运算符和函数
特点
PL/SQL语言是SQL语言的扩展,具有为程序开发而设计的特性,如数据封装、异常处理、面向对象等特性。PL/SQL是嵌入到Oracle服务器和开发工具中的,所以具有很高的执行效率和同Oracle数据库的完美结合。在PL/SQL模块中可以使用查询语句和数据操纵语句(即进行DML操作),这样就可以编写具有数据库事务处理功能的模块。
至于数据定义(DDL)和数据控制(DCL)命令的处理,需要通过Oracle提供的特殊的DMBS_SQL包来进行。PL/SQL还可以用来编写过程、函数、包及数据库触发器。过程和函数也称为子程序,在定义时要给出相应的过程名和函数名。它们可以存储在数据库中成为存储过程和存储函数,并可以由程序来调用,它们在结构上同程序模块类似。
PL/SQL过程化结构的特点是:可将逻辑上相关的语句组织在一个程序块内;通过嵌入或调用子块,构造功能强大的程序;可将一个复杂的问题分解成为一组便于管理、定义和实现的小块。
块结构和基本语法要求
PL/SQL程序的基本单元是块(BLOCK),块就是实现一定功能的逻辑模块。一个PL/SQL程序由一个或多个块组成。块有固定的结构,也可以嵌套。一个块可以包括三个部分,每个部分由一个关键字标识。
块中各部分的作用解释如下:
(1) DECLARE:声明部分标志。
(2) BEGIN:可执行部分标志。
(3) EXCEPTION:异常处理部分标志。
(4) END;:程序结束标志。
在以下的训练中,将使用函数DBMS_OUTPUT.PUT_LINE显示输出结果。DBMS_OUTPUT是Oracle提供的包,该包有如下三个用于输出的函数,用于显示PL/SQL程序模块的输出信息。
第一种形式:
DBMS_OUTPUT.PUT(字符串表达式);
用于输出字符串,但不换行,括号中的参数是要输出的字符串表达式。
第二种形式:
DBMS_OUTPUT.PUT_LINE(字符串表达式);
用于输出一行字符串信息,并换行,括号中的参数是要输出的字符串表达式。
第三种形式:
DBMS_OUTPUT.NEW_LINE;
用来输出一个换行,没有参数。
调用函数时,在包名后面用一个点“.”和函数名分隔,表示隶属关系。
要使用该方法显示输出数据,在SQL*Plus环境下要先执行一次如下的环境设置命令:
SET SERVEROUTPUT ON [SIZE n]
用来打开DBMS_OUTPUT.PUT_LINE函数的屏幕输出功能,系统默认状态是OFF。其中,n表示输出缓冲区的大小。n的范围在2000~1 000 000之间,默认为2000。如果输出内容较多,需要使用SIZE n来设置较大的输出缓冲区。
在PL/SQL模块中可以使用查询语句和数据操纵语句(即进行DML操作),所以PL/SQL程序是同SQL语言紧密结合在一起的。在PL/SQL程序中,最常见的是使用SELECT语句从数据库中获取信息,同直接执行SELECT语句不同,在程序中的SELECT语句总是和INTO相配合,INTO后跟用于接收查询结果的变量,形式如下:
SELECT 列名1,列名2... INTO 变量1,变量2... FROM 表名 WHERE 条件;
注意:接收查询结果的变量类型、顺序和个数同SELECT语句的字段的类型、顺序和个数应该完全一致。并且SELECT语句返回的数据必须是一行,否则将引发系统错误。当程序要接收返回的多行结果时,可以采用后面介绍的游标的方法。
使用INSERT、DELETE和UPDATE的语法没有变化,但在程序中要注意判断语句执行的状态,并使用COMMIT或ROLLBACK进行事务处理。
以下训练包含了按照标准结构书写的一个包含SELECT语句的PL/SQL程序示例。
【训练1】 查询雇员编号为7788的雇员姓名和工资。
步骤1:用SCOTT账户登录SQL*Plus。
步骤2:在输入区输入以下程序:
步骤3:按执行按钮或F5快捷键执行程序。
输出的结果是:
以上程序的作用是,查询雇员编号为7788的雇员姓名和工资,然后显示输出。这种方法同直接在SQL环境下执行SELECT语句显示雇员的姓名和工资比较,程序变得更复杂。那么两者究竟有什么区别呢?SQL查询的方法,只限于SQL环境,并且输出的格式基本上是固定的。而程序通过把数据取到变量中,可以进行复杂的处理,完成SQL语句不能实现的功能,并通过多种方式输出。
“--”是注释符号,后边是程序的注释部分。该部分不编译执行,所以在输入程序时可以省略。/*......*/中间也是注释部分,同“--”注释方法不同,它可以跨越多行进行注释。
PL/SQL程序的可执行语句、SQL语句和END结束标识都要以分号结束。
数据类型
变量的基本数据类型同SQL部分的字段数据类型相一致,但是也有不同,具体看附件里的图片。
NUMBER和VARCHAR2是最常用的数据类型。
VARCHAR2是可变长度的字符串,定义时指明最大长度,存储数据的长度是在最大长度的范围自动调节的,数据前后的空格,Oracle 9i会自动将其删去。
NUMBER型可以定义数值的总长度和小数位,如NUMBER(10,3)表示定义一个宽度为10、小数位为3的数值。整个宽度减去小数部分的宽度为整数部分的宽度,所以整数部分的宽度为7。
CHAR数据类型为固定长度的字符串,定义时要指明宽度,如不指明,默认宽度为1。定长字符串在显示输出时,有对齐的效果。
DATE类型用于存储日期数据,内部使用7个字节。其中包括年、月、日、小时、分钟和秒数。默认的格式为DD-MON-YY,如:07-8月-03表示2003年8月7日。
BOOLEAN为布尔型,用于存储逻辑值,可用于PL/SQL的控制结构。
LOB数据类型可以存储视频、音频或图片,支持随机访问,存储的数据可以位于数据库内或数据库外,具体有四种类型:BFILE、BLOB、CLOB、NCLOB。但是操纵大对象需要使用Oracle提供的DBMS_LOB包。
变量定义
1.变量定义
变量的作用是用来存储数据,可以在过程语句中使用。变量在声明部分可以进行初始化,即赋予初值。变量在定义的同时也可以将其说明成常量并赋予固定的值。变量的命名规则是:以字母开头,后跟其他的字符序列,字符序列中可以包含字母、数值、下划线等符号,最大长度为30个字符,不区分大小写。不能使用Oracle的保留字作为变量名。变量名不要和在程序中引用的字段名相重,如果相重,变量名会被当作列名来使用。
变量的作用范围是在定义此变量的程序范围内,如果程序中包含子块,则变量在子块中也有效。但在子块中定义的变量,仅在定义变量的子块中有效,在主程序中无效。
变量定义的方法是:
变量名 [CONSTANT] 类型标识符 [NOT NULL][:=值|DEFAULT 值];
关键字CONSTANT用来说明定义的变量是常量,如果是常量,必须有赋值部分进行赋值。
关键值NOT NULL用来说明变量不能为空。
∶=或DEFAULT用来为变量赋初值。
变量可以在程序中使用赋值语句重新赋值。通过输出语句可以查看变量的值。
在程序中为变量赋值的方法是:
变量名:=值 或 PL/SQL 表达式;
以下是有关变量定义和赋值的练习。
【训练1】 变量的定义和初始化。
输入和运行以下程序:
执行结果:
说明:本训练共定义了6个变量,分别用“:=”赋值运算符或DEFAULT 关键字对变量进行了初始化或赋值。其中:c_tax_rate为常量,在数据类型前加了 “CONSTANT” 关键字;v_valid变量在赋值运算符前面加了关键字“NOT NULL”,强制不能为空。如果变量是布尔型,它的值只能是“TRUE”、“FALSE”或“NULL”。本练习中的变量v_valid布尔变量的值只能取“TRUE”或“FALSE”。
2.根据表的字段定义变量
变量的声明还可以根据数据库表的字段进行定义或根据已经定义的变量进行定义。方法是在表的字段名或已经定义的变量名后加 %TYPE,将其当作数据类型。定义字段变量的方法如下:
变量名 表名.字段名%TYPE;
【训练2】 根据表的字段定义变量。
输入并执行以下程序:
执行结果:
说明:变量v_ename是根据表emp的ename字段定义的,两者的数据类型总是一致的。
如果我们根据数据库的字段定义了某一变量,后来数据库的字段数据类型又进行了修改,那么程序中的该变量的定义也自动使用新的数据类型。使用该种变量定义方法,变量的数据类型和大小是在编译执行时决定的,这为书写和维护程序提供了很大的便利。
3.结合变量的定义和使用
我们还可以定义SQL*Plus环境下使用的变量,称为结合变量。结合变量也可以在程序中使用,该变量是在整个SQL*Plus环境下有效的变量,在退出SQL*Plus之前始终有效,所以可以使用该变量在不同的程序之间传递信息。结合变量不是由程序定义的,而是使用系统命令VARIABLE定义的。在SQL*Plus环境下显示该变量要用系统的PRINT命令。
在SQL*Plus环境下定义结合变量的方法如下:
VARIABLE 变量名 数据类型
【训练3】 定义并使用结合变量。
步骤1:输入和执行下列命令,定义结合变量g_ename:
步骤2:删掉刚才输入的语句,输入和执行下列程序:
输出结果:
步骤3:重新执行程序。
输出结果:
步骤4:程序结束后用命令显示结合变量的内容:
输出结果:
说明:g_ename为结合变量,可以在程序中引用或赋值,引用时在结合变量前面要加上“∶”。在程序结束后该变量的值仍然存在,其他程序可以继续引用。
4.记录变量的定义
还可以根据表或视图的一个记录中的所有字段定义变量,称为记录变量。记录变量包含若干个字段,在结构上同表的一个记录相同,定义方法是在表名后跟%ROWTYPE。记录变量的字段名就是表的字段名,数据类型也一致。
记录变量的定义方法是:
记录变量名 表名%ROWTYPE;
获得记录变量的字段的方法是:记录变量名.字段名,如emp_record.ename。
如下练习中定义并使用了记录变量。
【训练4】 根据表定义记录变量。
输入并执行如下程序:
执行结果为:
说明:在以上的练习中定义了记录变量emp_record,它是根据表emp的全部字段定义的。SELECT语句将编号为7788的雇员的全部字段对应地存入该记录变量,最后输出记录变量的雇员名称字段emp_record.ename的内容。如果要获得其他字段的内容,比如要获得编号为7788的雇员的工资,可以通过变量emp_record.sal获得,依此类推。
5.TABLE类型变量
在PL/SQL中可以定义TABLE类型的变量。 TABLE数据类型用来存储可变长度的一维数组数据,即数组中的数据动态地增长。要定义TABLE变量,需要先定义TABLE数据类型。通过使用下标来引用TABLE变量的元素。
TABLE数据类型的定义形式如下:
TYPE 类型名 IS TABLE OF 数据类型[NOT NULL] INDEX BY BINARY_INTEGER;
此数据类型自动带有BINARY_INTEGER型的索引。
【训练5】 定义和使用TABLE变量:
执行结果为:
说明:本例定义了长度为10的字符型TABLE变量,通过赋值语句为前五个元素赋值,最后输出第三个元素。
运算符和函数
PL/SQL常见的运算符和函数包括以下方面(这里只做简单的总结,可参见SQL部分的例子):
* 算术运算:加(+)、减(?)、乘(*)、除(/)、指数(**)。
* 关系运算:小于(<)、小于等于(<=)、大于(>)、大于等于(>=)、等于(=)、不等于(!=或<>)。
* 字符运算:连接(||)。
* 逻辑运算:与(AND)、或(OR)、非(NOT)。
还有如下所示的特殊运算。
IS NULL:用来判断运算对象是否为空,为空则返回TRUE
LIKE:用来判断字符串是否与模式匹配
BETWEEN…AND…:判断值是否位于一个区间
IN(…):测试运算对象是否在一组值的列表中
IS NULL或IS NOT NULL用来判断运算对象的值是否为空,不能用“=”去判断。另外,对空值的运算也必须注意,对空值的算术和比较运算的结果都是空,但对空值可以进行连接运算,结果是另外一部分的字符串。例如:
NULL+5的结果为NULL。
NULL>5的结果为NULL。
NULL|| 'ABC' 的结果为'ABC'。
在PL/SQL中可以使用绝大部分Oracle函数,但是组函数(如AVG( )、MIN( )、MAX( )等)只能出现在SQL语句中,不能在其他语句中使用。还有GREATEST( )、LEAST( )也不能使用。类型转换在很多情况下是自动的,在不能进行自动类型转换的场合需要使用转换函数。
PL/SQL语言是SQL语言的扩展,具有为程序开发而设计的特性,如数据封装、异常处理、面向对象等特性。PL/SQL是嵌入到Oracle服务器和开发工具中的,所以具有很高的执行效率和同Oracle数据库的完美结合。在PL/SQL模块中可以使用查询语句和数据操纵语句(即进行DML操作),这样就可以编写具有数据库事务处理功能的模块。
至于数据定义(DDL)和数据控制(DCL)命令的处理,需要通过Oracle提供的特殊的DMBS_SQL包来进行。PL/SQL还可以用来编写过程、函数、包及数据库触发器。过程和函数也称为子程序,在定义时要给出相应的过程名和函数名。它们可以存储在数据库中成为存储过程和存储函数,并可以由程序来调用,它们在结构上同程序模块类似。
PL/SQL过程化结构的特点是:可将逻辑上相关的语句组织在一个程序块内;通过嵌入或调用子块,构造功能强大的程序;可将一个复杂的问题分解成为一组便于管理、定义和实现的小块。
块结构和基本语法要求
PL/SQL程序的基本单元是块(BLOCK),块就是实现一定功能的逻辑模块。一个PL/SQL程序由一个或多个块组成。块有固定的结构,也可以嵌套。一个块可以包括三个部分,每个部分由一个关键字标识。
块中各部分的作用解释如下:
(1) DECLARE:声明部分标志。
(2) BEGIN:可执行部分标志。
(3) EXCEPTION:异常处理部分标志。
(4) END;:程序结束标志。
在以下的训练中,将使用函数DBMS_OUTPUT.PUT_LINE显示输出结果。DBMS_OUTPUT是Oracle提供的包,该包有如下三个用于输出的函数,用于显示PL/SQL程序模块的输出信息。
第一种形式:
DBMS_OUTPUT.PUT(字符串表达式);
用于输出字符串,但不换行,括号中的参数是要输出的字符串表达式。
第二种形式:
DBMS_OUTPUT.PUT_LINE(字符串表达式);
用于输出一行字符串信息,并换行,括号中的参数是要输出的字符串表达式。
第三种形式:
DBMS_OUTPUT.NEW_LINE;
用来输出一个换行,没有参数。
调用函数时,在包名后面用一个点“.”和函数名分隔,表示隶属关系。
要使用该方法显示输出数据,在SQL*Plus环境下要先执行一次如下的环境设置命令:
SET SERVEROUTPUT ON [SIZE n]
用来打开DBMS_OUTPUT.PUT_LINE函数的屏幕输出功能,系统默认状态是OFF。其中,n表示输出缓冲区的大小。n的范围在2000~1 000 000之间,默认为2000。如果输出内容较多,需要使用SIZE n来设置较大的输出缓冲区。
在PL/SQL模块中可以使用查询语句和数据操纵语句(即进行DML操作),所以PL/SQL程序是同SQL语言紧密结合在一起的。在PL/SQL程序中,最常见的是使用SELECT语句从数据库中获取信息,同直接执行SELECT语句不同,在程序中的SELECT语句总是和INTO相配合,INTO后跟用于接收查询结果的变量,形式如下:
SELECT 列名1,列名2... INTO 变量1,变量2... FROM 表名 WHERE 条件;
注意:接收查询结果的变量类型、顺序和个数同SELECT语句的字段的类型、顺序和个数应该完全一致。并且SELECT语句返回的数据必须是一行,否则将引发系统错误。当程序要接收返回的多行结果时,可以采用后面介绍的游标的方法。
使用INSERT、DELETE和UPDATE的语法没有变化,但在程序中要注意判断语句执行的状态,并使用COMMIT或ROLLBACK进行事务处理。
以下训练包含了按照标准结构书写的一个包含SELECT语句的PL/SQL程序示例。
【训练1】 查询雇员编号为7788的雇员姓名和工资。
步骤1:用SCOTT账户登录SQL*Plus。
步骤2:在输入区输入以下程序:
- /*这是一个简单的示例程序*/
- SET SERVEROUTPUT ON
- DECLARE--定义部分标识
- v_name VARCHAR2(10); --定义字符串变量v_name
- v_sal NUMBER(5); --定义数值变量v_sal
- BEGIN --可执行部分标识
- SELECT ename,sal
- INTO v_name,v_sal
- FROM emp
- WHERE empno=7788;
- --在程序中插入的SQL语句
- DBMS_OUTPUT.PUT_LINE('7788号雇员是:'||v_name||',工资为:'||to_char(v_sal));
- --输出雇员名和工资
- END;
/*这是一个简单的示例程序*/ SET SERVEROUTPUT ON DECLARE--定义部分标识 v_name VARCHAR2(10); --定义字符串变量v_name v_sal NUMBER(5); --定义数值变量v_sal BEGIN --可执行部分标识 SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno=7788; --在程序中插入的SQL语句 DBMS_OUTPUT.PUT_LINE('7788号雇员是:'||v_name||',工资为:'||to_char(v_sal)); --输出雇员名和工资 END;--结束标识
步骤3:按执行按钮或F5快捷键执行程序。
输出的结果是:
7788号雇员是:SCOTT,工资为:3000 PL/SQL 过程已成功完成。
以上程序的作用是,查询雇员编号为7788的雇员姓名和工资,然后显示输出。这种方法同直接在SQL环境下执行SELECT语句显示雇员的姓名和工资比较,程序变得更复杂。那么两者究竟有什么区别呢?SQL查询的方法,只限于SQL环境,并且输出的格式基本上是固定的。而程序通过把数据取到变量中,可以进行复杂的处理,完成SQL语句不能实现的功能,并通过多种方式输出。
“--”是注释符号,后边是程序的注释部分。该部分不编译执行,所以在输入程序时可以省略。/*......*/中间也是注释部分,同“--”注释方法不同,它可以跨越多行进行注释。
PL/SQL程序的可执行语句、SQL语句和END结束标识都要以分号结束。
数据类型
变量的基本数据类型同SQL部分的字段数据类型相一致,但是也有不同,具体看附件里的图片。
NUMBER和VARCHAR2是最常用的数据类型。
VARCHAR2是可变长度的字符串,定义时指明最大长度,存储数据的长度是在最大长度的范围自动调节的,数据前后的空格,Oracle 9i会自动将其删去。
NUMBER型可以定义数值的总长度和小数位,如NUMBER(10,3)表示定义一个宽度为10、小数位为3的数值。整个宽度减去小数部分的宽度为整数部分的宽度,所以整数部分的宽度为7。
CHAR数据类型为固定长度的字符串,定义时要指明宽度,如不指明,默认宽度为1。定长字符串在显示输出时,有对齐的效果。
DATE类型用于存储日期数据,内部使用7个字节。其中包括年、月、日、小时、分钟和秒数。默认的格式为DD-MON-YY,如:07-8月-03表示2003年8月7日。
BOOLEAN为布尔型,用于存储逻辑值,可用于PL/SQL的控制结构。
LOB数据类型可以存储视频、音频或图片,支持随机访问,存储的数据可以位于数据库内或数据库外,具体有四种类型:BFILE、BLOB、CLOB、NCLOB。但是操纵大对象需要使用Oracle提供的DBMS_LOB包。
变量定义
1.变量定义
变量的作用是用来存储数据,可以在过程语句中使用。变量在声明部分可以进行初始化,即赋予初值。变量在定义的同时也可以将其说明成常量并赋予固定的值。变量的命名规则是:以字母开头,后跟其他的字符序列,字符序列中可以包含字母、数值、下划线等符号,最大长度为30个字符,不区分大小写。不能使用Oracle的保留字作为变量名。变量名不要和在程序中引用的字段名相重,如果相重,变量名会被当作列名来使用。
变量的作用范围是在定义此变量的程序范围内,如果程序中包含子块,则变量在子块中也有效。但在子块中定义的变量,仅在定义变量的子块中有效,在主程序中无效。
变量定义的方法是:
变量名 [CONSTANT] 类型标识符 [NOT NULL][:=值|DEFAULT 值];
关键字CONSTANT用来说明定义的变量是常量,如果是常量,必须有赋值部分进行赋值。
关键值NOT NULL用来说明变量不能为空。
∶=或DEFAULT用来为变量赋初值。
变量可以在程序中使用赋值语句重新赋值。通过输出语句可以查看变量的值。
在程序中为变量赋值的方法是:
变量名:=值 或 PL/SQL 表达式;
以下是有关变量定义和赋值的练习。
【训练1】 变量的定义和初始化。
输入和运行以下程序:
- SET SERVEROUTPUT ON
- DECLARE --声明部分标识
- v_job VARCHAR2(9);
- v_count BINARY_INTEGER DEFAULT 0;
- v_total_sal NUMBER(9,2) := 0;
- v_date DATE := SYSDATE + 7;
- c_tax_rate CONSTANT NUMBER(3,2) := 8.25;
- v_valid BOOLEAN NOT NULL := TRUE;
- BEGIN
- v_job:='MANAGER';
- --在程序中赋值
- DBMS_OUTPUT.PUT_LINE(v_job);
- --输出变量v_job的值
- DBMS_OUTPUT.PUT_LINE(v_count);
- --输出变量v_count的值
- DBMS_OUTPUT.PUT_LINE(v_date);
- --输出变量v_date的值
- DBMS_OUTPUT.PUT_LINE(c_tax_rate);
- --输出变量c_tax_rate的值
- END;
SET SERVEROUTPUT ON DECLARE --声明部分标识 v_job VARCHAR2(9); v_count BINARY_INTEGER DEFAULT 0; v_total_sal NUMBER(9,2) := 0; v_date DATE := SYSDATE + 7; c_tax_rate CONSTANT NUMBER(3,2) := 8.25; v_valid BOOLEAN NOT NULL := TRUE; BEGIN v_job:='MANAGER'; --在程序中赋值 DBMS_OUTPUT.PUT_LINE(v_job); --输出变量v_job的值 DBMS_OUTPUT.PUT_LINE(v_count); --输出变量v_count的值 DBMS_OUTPUT.PUT_LINE(v_date); --输出变量v_date的值 DBMS_OUTPUT.PUT_LINE(c_tax_rate); --输出变量c_tax_rate的值 END;
执行结果:
MANAGER 0 18-4月 -03 8.25 PL/SQL 过程已成功完成。
说明:本训练共定义了6个变量,分别用“:=”赋值运算符或DEFAULT 关键字对变量进行了初始化或赋值。其中:c_tax_rate为常量,在数据类型前加了 “CONSTANT” 关键字;v_valid变量在赋值运算符前面加了关键字“NOT NULL”,强制不能为空。如果变量是布尔型,它的值只能是“TRUE”、“FALSE”或“NULL”。本练习中的变量v_valid布尔变量的值只能取“TRUE”或“FALSE”。
2.根据表的字段定义变量
变量的声明还可以根据数据库表的字段进行定义或根据已经定义的变量进行定义。方法是在表的字段名或已经定义的变量名后加 %TYPE,将其当作数据类型。定义字段变量的方法如下:
变量名 表名.字段名%TYPE;
【训练2】 根据表的字段定义变量。
输入并执行以下程序:
- SET SERVEROUTPUT ON
- DECLARE
- v_ename emp.ename%TYPE;--根据字段定义变量
- BEGIN
- SELECT ename
- INTO v_ename
- FROM emp
- WHERE empno = 7788;
- DBMS_OUTPUT.PUT_LINE(v_ename);
- --输出变量的值
- END;
SET SERVEROUTPUT ON DECLARE v_ename emp.ename%TYPE;--根据字段定义变量 BEGIN SELECT ename INTO v_ename FROM emp WHERE empno = 7788; DBMS_OUTPUT.PUT_LINE(v_ename); --输出变量的值 END;
执行结果:
SCOTT PL/SQL 过程已成功完成。
说明:变量v_ename是根据表emp的ename字段定义的,两者的数据类型总是一致的。
如果我们根据数据库的字段定义了某一变量,后来数据库的字段数据类型又进行了修改,那么程序中的该变量的定义也自动使用新的数据类型。使用该种变量定义方法,变量的数据类型和大小是在编译执行时决定的,这为书写和维护程序提供了很大的便利。
3.结合变量的定义和使用
我们还可以定义SQL*Plus环境下使用的变量,称为结合变量。结合变量也可以在程序中使用,该变量是在整个SQL*Plus环境下有效的变量,在退出SQL*Plus之前始终有效,所以可以使用该变量在不同的程序之间传递信息。结合变量不是由程序定义的,而是使用系统命令VARIABLE定义的。在SQL*Plus环境下显示该变量要用系统的PRINT命令。
在SQL*Plus环境下定义结合变量的方法如下:
VARIABLE 变量名 数据类型
【训练3】 定义并使用结合变量。
步骤1:输入和执行下列命令,定义结合变量g_ename:
VARIABLE g_ename VARCHAR2(100)
步骤2:删掉刚才输入的语句,输入和执行下列程序:
- SET SERVEROUTPUT ON
- BEGIN
- :g_ename:=:g_ename|| 'Hello~ ';
- --在程序中使用结合变量
- DBMS_OUTPUT.PUT_LINE(:g_ename);
- --输出结合变量的值
- END;
SET SERVEROUTPUT ON BEGIN :g_ename:=:g_ename|| 'Hello~ '; --在程序中使用结合变量 DBMS_OUTPUT.PUT_LINE(:g_ename); --输出结合变量的值 END;
输出结果:
Hello~ PL/SQL 过程已成功完成。
步骤3:重新执行程序。
输出结果:
Hello~ Hello~ PL/SQL 过程已成功完成。
步骤4:程序结束后用命令显示结合变量的内容:
PRINT g_ename
输出结果:
G_ENAME ----------------------------------------------- Hello~ Hello~
说明:g_ename为结合变量,可以在程序中引用或赋值,引用时在结合变量前面要加上“∶”。在程序结束后该变量的值仍然存在,其他程序可以继续引用。
4.记录变量的定义
还可以根据表或视图的一个记录中的所有字段定义变量,称为记录变量。记录变量包含若干个字段,在结构上同表的一个记录相同,定义方法是在表名后跟%ROWTYPE。记录变量的字段名就是表的字段名,数据类型也一致。
记录变量的定义方法是:
记录变量名 表名%ROWTYPE;
获得记录变量的字段的方法是:记录变量名.字段名,如emp_record.ename。
如下练习中定义并使用了记录变量。
【训练4】 根据表定义记录变量。
输入并执行如下程序:
- SET SERVEROUTPUT ON
- DECLARE
- emp_record emp%ROWTYPE;--定义记录变量
- BEGIN
- SELECT * INTO emp_record
- FROM emp
- WHERE mpno = 7788;--取出一条记录
- DBMS_OUTPUT.PUT_LINE(emp_record.ename); --输出记录变量的某个字段
- END;
SET SERVEROUTPUT ON DECLARE emp_record emp%ROWTYPE;--定义记录变量 BEGIN SELECT * INTO emp_record FROM emp WHERE mpno = 7788;--取出一条记录 DBMS_OUTPUT.PUT_LINE(emp_record.ename); --输出记录变量的某个字段 END;
执行结果为:
SCOTT PL/SQL 过程已成功完成。
说明:在以上的练习中定义了记录变量emp_record,它是根据表emp的全部字段定义的。SELECT语句将编号为7788的雇员的全部字段对应地存入该记录变量,最后输出记录变量的雇员名称字段emp_record.ename的内容。如果要获得其他字段的内容,比如要获得编号为7788的雇员的工资,可以通过变量emp_record.sal获得,依此类推。
5.TABLE类型变量
在PL/SQL中可以定义TABLE类型的变量。 TABLE数据类型用来存储可变长度的一维数组数据,即数组中的数据动态地增长。要定义TABLE变量,需要先定义TABLE数据类型。通过使用下标来引用TABLE变量的元素。
TABLE数据类型的定义形式如下:
TYPE 类型名 IS TABLE OF 数据类型[NOT NULL] INDEX BY BINARY_INTEGER;
此数据类型自动带有BINARY_INTEGER型的索引。
【训练5】 定义和使用TABLE变量:
- SET SERVEROUTPUT ON
- DECLARE
- TYPE type_table IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER; --类型说明
- v_t type_table; --定义TABLE变量
- BEGIN
- v_t(1):='MONDAY';
- v_t(2):='TUESDAY';
- v_t(3):='WEDNESDAY';
- v_t(4):='THURSDAY';
- v_t(5):='FRIDAY';
- DBMS_OUTPUT.PUT_LINE(v_t(3)); --输出变量的内容
- END;
SET SERVEROUTPUT ON DECLARE TYPE type_table IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER; --类型说明 v_t type_table; --定义TABLE变量 BEGIN v_t(1):='MONDAY'; v_t(2):='TUESDAY'; v_t(3):='WEDNESDAY'; v_t(4):='THURSDAY'; v_t(5):='FRIDAY'; DBMS_OUTPUT.PUT_LINE(v_t(3)); --输出变量的内容 END;
执行结果为:
WEDNESDAY PL/SQL 过程已成功完成。
说明:本例定义了长度为10的字符型TABLE变量,通过赋值语句为前五个元素赋值,最后输出第三个元素。
运算符和函数
PL/SQL常见的运算符和函数包括以下方面(这里只做简单的总结,可参见SQL部分的例子):
* 算术运算:加(+)、减(?)、乘(*)、除(/)、指数(**)。
* 关系运算:小于(<)、小于等于(<=)、大于(>)、大于等于(>=)、等于(=)、不等于(!=或<>)。
* 字符运算:连接(||)。
* 逻辑运算:与(AND)、或(OR)、非(NOT)。
还有如下所示的特殊运算。
IS NULL:用来判断运算对象是否为空,为空则返回TRUE
LIKE:用来判断字符串是否与模式匹配
BETWEEN…AND…:判断值是否位于一个区间
IN(…):测试运算对象是否在一组值的列表中
IS NULL或IS NOT NULL用来判断运算对象的值是否为空,不能用“=”去判断。另外,对空值的运算也必须注意,对空值的算术和比较运算的结果都是空,但对空值可以进行连接运算,结果是另外一部分的字符串。例如:
NULL+5的结果为NULL。
NULL>5的结果为NULL。
NULL|| 'ABC' 的结果为'ABC'。
在PL/SQL中可以使用绝大部分Oracle函数,但是组函数(如AVG( )、MIN( )、MAX( )等)只能出现在SQL语句中,不能在其他语句中使用。还有GREATEST( )、LEAST( )也不能使用。类型转换在很多情况下是自动的,在不能进行自动类型转换的场合需要使用转换函数。
发表评论
-
高级SQL优化
2012-12-08 23:31 802高级SQL优化(一) ... -
oracle PL/SQL的基本构成,结构控制语句,分支结构,选择结构,loop循环结构,
2011-10-08 01:43 891oracle PL/SQL的基本构成,结构控制语句,分支结构, ... -
oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包
2011-10-08 01:42 1018oracle 创建,删除存储过 ... -
oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器
2011-10-08 01:39 955oracle 触发器的种类和触发事件,DML触发器,DDL事 ... -
oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理,自定义异常
2011-10-08 01:31 807oracle 隐式游标,显示游标,游标循环,动态SELE ... -
触发器、内置程序包
2011-10-07 10:19 926触发器、内置程序包 1、技术目标 应用触发器 ... -
子程序、程序包
2011-10-07 10:18 1147子程序、程序包 1、技术目标 创建并使用子程序 ... -
游标的使用
2011-10-07 10:16 1362游标 1、技术目标 游标的使用 2、什么是游标 ... -
PL/SQL 的使用
2011-10-07 10:15 2089使用PL/SQL 1、技术目标 理解 PL/SQL ... -
同义词、序列、视图、索引
2011-10-07 10:12 1706同义词、序列、视图、 ... -
什么是Oracle归档模式
2011-10-06 23:31 835查看oracle数据库是否为归档模式 [1] 1.se ... -
什么是冷备份和热备份,有什么区别?
2011-10-06 23:19 924对于oracle数据库只有物 ... -
Oracle数据导入导出
2011-10-06 23:17 649Oracle数据导入导出imp/exp就相当于oracle ... -
ORACLE闪回技术
2011-10-06 23:17 7421 .误删了一部分数据 (delete) 想回恢复数据,ora ...
相关推荐
PL/SQL块结构 PL/SQL流程 运算符和表达式 游标 异常处理 数据库存储过程和函数 包 触发器 §1.2 SQL与PL/SQL §1.2.1 什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写。ORACLE的SQL...
这一部分概述了 Transact-SQL 和 PL/SQL 语言语法之间的相同点和不同点,并给出转换策略。 要将 Oracle DML 语句和 PL/SQL 程序迁移到 SQL Server 时,请按下列步骤执行: 1. 验证所有 SELECT、INSERT、UPDATE 和 ...
·使用PL/SQL 结构体、分隔符、运算符、变量和语句; ·使用PLSQL_WARNINGS 和异常处理程序标识和消除错误; ·使用函数、过程、包、集合和触发器; ·定义和部署varray 、嵌套表和联合数组数据类型; ·...
1. 验证所有 SELECT、INSERT、UPDATE 和 DELETE 语句的语法是有效的。进行任何必要的修改。 2. 把所有外部联接改为 SQL-92 标准外部联接语法。 3. 用相应 SQL Server 函数替代 Oracle 函数。 4. 检查所有的比较...
1) 扩展变量和类型; 2) 扩展控制结构; 3) 扩展过程与函数; 4) 扩展对象类型与方法 ---- 第二章 PL/SQL程序结构 ---- 1. PL/SQL块 1) 申明部分, DECLARE (如果语句不需要声明任何变量,可以不写); 2) ...
要将 Oracle DML 语句和 PL/SQL 程序迁移到 SQL Server 时,请按下列步骤执行: 1. 验证所有 SELECT、INSERT、UPDATE 和 DELETE 语句的语法是有效的。进行任何必要的修改。 2. 把所有外部联接改为 SQL-92 标准外部...
·使用PL/SQL 结构体、分隔符、运算符、变量和语句; ·使用PLSQL_WARNINGS 和异常处理程序标识和消除错误; ·使用函数、过程、包、集合和触发器; ·定义和部署varray 、嵌套表和联合数组数据类型; ·...
第十二章PL/SQL 块结构和组成元素 235 §12.1 PL/SQL结构 235 §12.2 PL/SQL块 236 §12.3 标识符 236 §12.4 PL/SQL 变量类型 237 §12.4.1 变量类型 237 §12.4.2 复合类型(记录和表) 238 §12.4.3 使用%ROWTYPE...
3.2.5 文本和图形数据类型 44 3.2.6 自定义数据类型 44 3.3 表的创建(create) 46 3.3.1 创建基本表 46 3.3.2 非空约束 47 3.3.3 default指定缺省值 49 3.4 表的修改 50 3.4.1 增加新列 50 3.4.2 删除列 51...
《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...
第十二章PL/SQL 块结构和组成元素 235 §12.1 PL/SQL结构 235 §12.2 PL/SQL块 236 §12.3 标识符 236 §12.4 PL/SQL 变量类型 237 §12.4.1 变量类型 237 §12.4.2 复合类型(记录和表) 238 §12.4.3 使用%ROWTYPE...
10.1 描述和使用SQL中的字符、数字和日期函数 348 10.1.1 定义函数 348 10.1.2 函数类型 348 10.1.3 使用大小写转换函数 349 10.1.4 使用字符操作函数 350 10.1.5 使用数字函数 353 10.1.6 使用日期 355 ...
作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...
10.1 描述和使用SQL中的字符、数字和日期函数 348 10.1.1 定义函数 348 10.1.2 函数类型 348 10.1.3 使用大小写转换函数 349 10.1.4 使用字符操作函数 350 10.1.5 使用数字函数 353 10.1.6 使用日期 355 ...
附录含有完整的函数和定义、命令行开关、特殊变量、常见模块和Perl调试器的列表,全功能的、面向对象的CGI程序,一些有用的脚本,以及很有帮助的HTM教程。 本书非常适合于Perl语言初学者阅读,对于Perl程序员,也有...
SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。 SQL语言主要包含5个部分 数据定义...
2.变量、数据类型和运算符和表达式 3运算符和程序流程结构 4.数组 5.类和对象 6.字符串 7.封装,继承,多肽 8.接口与抽象类 9.java集合类 10.jdbc 11 html简介与js的基本语法 12 javascript内置对象和内置函数 13 ...