Oracle学习笔记(三)PL/SQL编程 Oracle学习笔记(三)PL/SQL编程

Oracle学习笔记(三)PL/SQL编程

目录

 

1.PL/SQL简介

PL/SQL块结构

代码注释和标示符

文本

2.数据类型、变量和常量

基本数据类型

特殊数据类型

定义变量和常量

PL/SQL表达式

3.流程控制语句

选择语句

循环语句


1.PL/SQL简介

PL/SQL块结构

PL/SQL程序都是以块(BLOCK)为基本单位,整个PL/SQL块分三部分:声明部分、执行部分和异常处理部分:


 
  
  
  1. [ DECLARE]
  2. --声明部分,可选
  3. BEGIN
  4. --执行部分,必须
  5. [ EXCEPTION]
  6. --异常处理部分,可选
  7. END

a.声明部分由关键字DECLARE开始,到BEGIN关键字结束。在这部分可以声明程序块中所用到的变量、常量和游标等。

注意:声明的内容只能在当前PL/SQL块中使用。

b.执行部分以关键字BEGIN开始,结束方式有两种:一是代码在运行时出现异常,则执行完异常处理部分的代码就结束,二是未出现异常或未使用异常处理,则以关键字END结束。执行部分是整个PL/SQL程序块的主体,主要的逻辑控制和运算都在这部分完成。

c.异常处理部分已关键字EXCEPTION开始,在该关键字所包含的代码执行完毕后,整个PL/SQL块也就结束了。异常处理部分用来纠正错误或给用户一些错误信息提示,甚至是将各种数据回退到异常产生之前的状态,多用WHEN THEN实现判断。

直接举个例子:

定义一个PL/SQL块,计算两个整数的和与这两个整数的差的商。

set serveroutput on 命令是为了实现在服务端显示执行结果。

代码注释和标示符

1.单行注释:

由两个连接字符“--”开始,后面跟注释内容

2.多行注释:

由/*开头,以*/结尾

3.标识符:

标识符用于定义PL/SQL块单元和程序项的名称。通过使用标识符,可以定义常量、变量、异常、显示游标、游标变量、参数、子程序及包的名称。

注意:

当定义变量、常量时,每行只能定义一个变量或常量。

当定义变量、常量时,名称必须以英文字符开始。

当定义变量、常量时,名称只能使用符号a~z、A~Z、0~9、_、$和#。不能使用oracle关键字。

4.分界符:

符号 意义 符号 意义
+ 加操作符 >= 大于等于操作符
- 减操作符 @ 数据库链接指示符
* 乘操作符 / 字符串分界符
/ 除操作符 : 绑定变量指示符
= 等于操作符 ** 指数操作符
> 大于操作符 := 赋值操作符
< 小于操作符 => 链接操作符
( 起始表达式操作符 .. 范围操作符
) 终结表达式操作符 || 范围操作符
; 语句终结符 << 起始标签操作符
% 属性指示符 >> 终结标签分界符
, 项目分隔符 -- 单行注释指示符
<> 不等于操作符 /* 多行注释起始符
!= 不等于操作符 */ 多行注释终止符
~= 不等于操作符 <space> 空格
^= 不等于操作符 <tab> 制表符
<= 小于等于操作符    

文本

文本是指实际的数值的文字,包括:

数字文本:100    2.45   3e3    5E6   6*10**3     (科学计数法和幂操作符只适用于PL/SQL语句,不适用于SQL语句)

字符文本:'A'    '9'    '<'    ' '    '%'

布尔文本:指BOOLEAN值(TRUE、FALSE和NULL)

日期时间文本:'10-NOV-91'     '1997-10-22 13:01:01'      '09-10-月-03'

字符串文本:'Hello World'    '$9600'    '10-NOV-91'

2.数据类型、变量和常量

基本数据类型

1.数值类型 

number  如:number(9,2)

子类型:DEC,DECIMAL,DOUBLE,INTEGER,INT,NUMERIC,SMALLINT,BINARY_INTEGER,PLS_INTEGER

2.字符类型

VARCHAR2(maxlength)  最大为4000,超过则用LONG

CHAR(maxlength)  如果赋给char类型的值不足maxlength,会用空格补全

LONG

NCHAR和NVARCHAR2  才加入的类型

3.日期类型

DATE 7个字节,分别存储 世纪,年,月,日,小时,分钟,秒

4.布尔类型

BOOLEAN  只有三个值 TRUE,FALSE,NULL

特殊数据类型

1.%TYPE

可以声明一个与指定列相同的数据类型,它通常紧跟在指定列名的后面

如:


 
  
  
  1. declare
  2. var_job emp.job% TYPE;

2.RECORD类型

记录类型,使用该类型的变量可以存储由多个列值组成的一行数据。它是一种结构化的数据类型,需要先用type语句定义记录类型,然后才可以声明记录类型的变量


 
  
  
  1. declare
  2. type emp_type is record (
  3. var_ename varchar2( 20),
  4. var_job varchar2( 20),
  5. var_sal number
  6. );
  7. empinfo emp_type; --定义变量
  8. begin
  9. select ename,job,sal
  10. into empinfo
  11. from emp
  12. where empno= 7369;
  13. dbms_output.put_line(empinfo.var_ename || '的职务是' || 'empinfo.var_job');
  14. end;

3.%ROWTYPE类型

结合了以上两种类型的优点


 
  
  
  1. declare
  2. rowVar_emp emp%rowtype; --定义能够存储emp表中一行数据的变量
  3. begin
  4. select *
  5. into rowVar_emp
  6. from emp
  7. where empno= 7369;
  8. dbms_output.put_line(rowVar_emp.ename || '的职务是' || 'rowVar_emp.job');
  9. end;

定义变量和常量

1.定义变量

<变量名> <数据类型> [(长度):=<初始值>];

变量名和数据类型必需

如: var_countryname varchar2(50):='中国';

2.定义常量

<常量名> constant <数据类型>:=<常量值>;

如: con_day constant integer:=365;

3.变量初始化

PL/SQL中,未初始化的变量默认被赋值为NULL,而不是随机的

PL/SQL表达式

1.字符表达式

只有一个,并置运算符 “||” ,用于把几个字符串连在一起

2.布尔表达式

一般用于判断,值只有TRUE,FALSE,NULL

有3个布尔运算符 AND,OR,NOT

布尔表达式中海还有一系列算术运算符,大于小于等于不等。

3.流程控制语句

选择语句

1. IF...THEN语句


 
  
  
  1. if <condition_expression> then
  2. plsql_sentence
  3. end if;

2.IF...THEN...ELSE语句

3.IF...THEN...ELSIF语句

4.case语句


 
  
  
  1. case <selector>
  2. when ... then ... ;
  3. when ... then ... ;
  4. ...
  5. when ... then ... ;
  6. else ... ;
  7. end case;

循环语句

1.LOOP语句

loop语句会先执行一次循环体,再进行判断


 
  
  
  1. loop
  2. plsql_sentence;
  3. exit when end_condition_exp
  4. end loop;

2.WHILE语句

先判断,再执行


 
  
  
  1. while condition_expression loop
  2. plsql_sentence;
  3. end loop;

3.FOR语句

可预置循环次数,有一个循环计数器


 
  
  
  1. for 整型变量 in [reverse] 下限值..上限值 loop
  2. plsql_sentence;
  3. end loop;

默认随循环递增,使用reverse关键字时递减

4.GOTO语句

无条件转向语句

GOTO label;
 
  
  

执行GOTO语句时,控制程序会立即转到由标签标识的语句。label是PL/SQL中定义的符号,用双箭头<<>>括起来


 
  
  
  1. <<goto_mark>>
  2. --程序其他部分
  3. IF no>666 THEN
  4.    GOTO goto_mark;

 

目录

猜你喜欢

转载自blog.csdn.net/qq_41072487/article/details/106520773
今日推荐