Oracle之PL/SQL学习笔记之数据类型(三)

别等时光非礼了梦想. 提交于 2019-12-05 05:21:04

Oracle之PL/SQL学习笔记之数据类型(三)

        所有的编程语言中变量是使用最频繁的。PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到动态执行程序,同时也可以利用变量在PL/SQL内部进行值得传递,甚至可以把值传递出去,最终返回给用户,由此可见,变量是PL/SQL不可或缺的一部分。


1. Oracle预定义的普通数据类型(常见的数据类型)

类型 子类 说明
Oracle中的范围
char

Character,String

Rowid,Nchar

定长字符串

民族字符集

2000(缺省值1)
varchar2

varchar,String

,Nvarchar2

可变字符串

民族语言字符集

4000
Binary_integer

带符号整数,为整数计算优化性能
number(s,p)
double,integer,int

Long
变长字符串 32767
date
日期型
ROWID
存放数据库行号
URowid
通用行标识符,字符串类型


2. 复合类型

        Oracle在PL/SQL中除了提供像前面介绍的各种类型外,还提供一种称为复合类型的类型:

      记录和表


2.1 使用%type

        我们先看下面的例子:

declare 
  c_ename constant varchar2(50):='KING';
  v_job  varchar2(50);
-----------------------------------------------
--备注:通过雇员姓名查找雇员的职称
-----------------------------------------------
begin
  select job into v_job from emp where ename=c_ename;
  dbms_output.put_line('雇员'||c_ename||'的职称为:'||v_job);  
end;

   假如现在emp表的job字段长度为20 ,我们使用varchar2(50)来接收job的值可以,如果我们修改emp表结构,job字段的长度为varchar2(100),那么是不是有可能

我们的v_job  varchar2(50)  长度不够存储job列的值,会报异常:numeric or value error: character string buffer too small        

  那我们怎么来避免这种情况呢?我们看下修改后的代码:

declare 
  c_ename constant varchar2(50):='KING';
  v_job  emp.job%type;
-----------------------------------------------
--备注:通过雇员姓名查找雇员的职称
-----------------------------------------------
begin
  select job into v_job from emp where ename=c_ename;
  dbms_output.put_line('雇员'||c_ename||'的职称为:'||v_job);  
end;

 

  定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据相同,这时可以使用%type

使用%type特性的优点在于:

  • 所引用的数据库列的数据类型可以不必知道

  • 所引用的数据库列的数据类型可以实时改变


实例:

declare 
  c_ename constant varchar2(50):='KING';
  v_job  emp.job%type;
  v_deptno emp.deptno%type;
-----------------------------------------------
--备注:通过雇员姓名查找雇员的职称,与部门编号
-----------------------------------------------
begin
  select job,deptno into v_job,v_deptno from emp where ename=c_ename;
  dbms_output.put_line('雇员'||c_ename||'的职称为:'||v_job||',部分编号为:'||v_deptno);  
end;

  上面查询出两个字段的值,我们需要定义两个变量来接收它,如果是3个,5个,10个或者更多怎么办,那么我们是不是需要定义很多的变量来接收它呢,下面我们来看如何解决这个问题!


2.2 记录类型(record)

        record 可以看成为多个单独变量的集合,可以方便我们的查询,INSERT,UPDATE

        若创建records,需要先定义一个record类型,再用该类型声明遍。也可以创建或查找一个表,视图,或PL/SQL游标,总之是你想要的值,使用%ROWTYPE属性来创建匹配的record。

        你可以在任何PL/SQL块,子程序或包的声明部分定义record类型。当你定义record类型时,不能在域上指定一个NOT NULL的约束,或给出它们的默认值。

        实例:

declare 
  type emp_record is record(
       job emp.job%type,--职称
       deptno emp.deptno%type --部门编号, 多个用, 隔开    
  ); -- 定义record类型
  v_emp_record  emp_record; --定义一个record类型的变量
begin              
  select job,deptno into v_emp_record from emp where empno=7788;
  dbms_output.put_line('雇员职称:'||v_emp_record.job||'雇员部门编号:'||v_emp_record.deptno); 
end;


2.2.1 record 定义

    record定义必须在PL/SQL块中,格式为: type record_name is record( cl1 ,cl2 ,cl2 ...);

2.2.2 record 使用

    使用记录类型的变量名.字段名 (可以这样理解)

dbms_output.put_line('雇员职称:'||v_emp_record.job||'雇员部门编号:'||v_emp_record.deptno);

2.2.3 record的常用场景

declare 
  v_emp_record  emp%rowtype; --table_name%rowtype 本身就是一个记录类型,所有可以直接申明这个类型的变量就ok了
begin
  select * into v_emp_record from emp where empno=7788;
  dbms_output.put_line('雇员职称:'||v_emp_record.job||'雇员部门编号:'||v_emp_record.deptno); 
end;

     table_name%rowtype 本身就是一个记录类型,所有可以直接申明这个类型的变量就ok了


2.3 %ROWTYPE

   上面已经说了    table_name%ROWTYPE 本身就是一个记录类型,这个记录类型包含了table_name这张表中的所有的字段。

    并且不需要定义记录类型了,可以直接定义记录类型的变量,也可以说是记录类型的一种简化吧!

declare 
  v_dept_record  dept%rowtype; --定义一个record类型的变量
begin
  select * into v_dept_record from dept where deptno=10;
  dbms_output.put_line('部门名称:'||v_dept_record.dname||'部门编号:'||v_dept_record.deptno); 
end;

  

下面将对游标单独讲解,未完待续 .......



 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!