第三章:plsql基础学习目标
能运用PL/SQL语句编写简单的程序
熟练使用控制结构语句
知道游标、过程函数、触发器的作用
能够定义过程游标和建立触发器
通过上机熟练掌握PL/SQL
PL/SQL概述
PL/SQL的全称是:Procedureal Language/SQL即过程化SQL语言。
它是在标准SQL语言下发展起来的,PL/SQL语言将变量、控制结构、过程和函数等结构化程序设计的要素引入到SQL语言中。
它的特点是:具有模块化的结构、使用过程化语言控制结构、能够进行错误处理。
Pl/sql是一个块结构,划分为:
声明部分(declarative section)
执行部分(executable section)
异常处理部分(exception section)
其格式如下:
Declare
声明部分
Begin
执行部分
Exception
异常执行部分
End ;
Pl/sql块中的注释分为:
单行注释(--)
多行注释(/* */)
Pl/sql块的标识符由一个字母开始,后面选折性地跟随任意多的字母,数字,货币符号($),下划线(_),#等符号组成.不允许使用空格,斜线(/),短横线(-),&,%.最大长度为30个字符.
Pl/sql块的字符集由如下字符组成:
大写字母A-Z和小写字母a-b
数字0-9
符号
(,),+,-,*,/,<,>,=,!,~,^,;,:,.,’,@,”,#,$,_,|, {,},?,[,]
制表符,空格符,回车符等非显示的间空符号.
其中一些字符用于编程,另外一些用做算术运算符或关系运算符声明及变量
Pl/sql块的变量声明块由DECLARE关键字开始,BEGIN程序体结束。是一种强类型语言,如:
Declare
v_id integer;
v_name varchar(20);
begin
其变量的定义语法如下:
Varriable_name [CONSTANT] databyte
[NOT NULL] [:=|DEFAULT expression]
如果有了NOT NULL约束条件,则初始化必须赋值。
也可以直接赋值(使用语法:=),也可以通过SQL SELECT INTO 或FETCH INTO给变量赋值。
while语句都可以用for改写表达式
Pl/sql块中也可以执行各种算术表达式,如下:
declare
result number;
begin
result:=10+3*4+40;
dbms_output.put_line('result:'||result);
end;
执行结果为:
Result:62
PL/SQL过程已成功完成。
Dbms_output.put_line函数是输出后换行,put是输出不换行.
PL/SQL运行环境
Pl/sql块可以运行在如下的环境中:
1. SQL*PLUS:oracle经典客户端连接工具。
2. TOAD:第三方公司的客户端连接工具。
3. PL/SQL Developer:第三方公司的客户端连接工具。
PL/SQL程序块示例
下面我们来看两个例子:
例1:
--将date数据类型隐式转换为timestamp并输出
declare
v_checkout timestamp(6);
begin
v_checkout:=sysdate;
dbms_output.put_line(v_checkout);
end;
例2:
--将当前时间增加1年零3个月输出
declare
v_lifetime interval year(4) to month;
aa date;
begin
v_lifetime := interval '0001-3' year to month;
select sysdate+v_lifetime into aa from dual;
dbms_output.put_line(aa);
end;
PL/SQL数据类型
Pl/sql数据类型由:
建表数据类型+建表兼容类型+Boolean+
%type+
%rowtype+
%record+
Table
组成。
其中boolean不属于建表类型,在数据库中不能直接表示
true,false,而用数字或者字符类型代替,下面我们介绍下面四种数据类型,如下:
%type数据类型
我们通过一个例子来说明这个数据类型,如下:
declare
v_ame%type;
v_sal emp.sal%type;
c_tax_rate constant number(3,2) :=0.03;
v_sal_tax v_sal%type;
begin
select ename,sal into v_ename,v_sal from emp
where empno=&eno;
v_sal_tax := v_sal * c_tax_rate;
dbms_output.put_line('雇员名字:'||v_ename);
dbms_output.put_line('雇员薪水:'||v_sal);
dbms_output.put_line('雇员所得
税:'||v_sal_tax);
end;
在这个例子中,我们定义v_ename变量的时候没有用到varchar2数据类型,而是直接映射到emp表中的ename字段类型上了,这样当表中的此字段数据类型改变时,v_ename变量数据类型也改变了。
%rowtype
我们通过一个例子来说明这个数据类型,如下:
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where empno=&eno;
dbms_output.put_line('雇员名字:'||ame);
dbms_output.put_line('雇员薪水:'||v_emp.sal);
dbms_output.put_line('雇员工种'||v_emp.job);
end;
在这个例子中,我们定义v_emp变量的时候直接映射到emp表中的所有字段类型,形成一个集合,这样当我们取出其中的一个的时候,就可以使用v_emp.”字段名字”就可以了。
record数据类型
这个数据类型类似于结构(structure),属于自定义数据类型的一种,定义的语法如下:
type record_type is record(v1 data_type1,v2 data_type2,vn data_typen);
下面我们看一个例子:
declare
type emp_record_type is record(
ame%type,
salary emp.sal%type,
job emp.job%type);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论