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

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

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


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

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

Character,Stringsql

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中除了提供像前面介绍的各类类型外,还提供一种称为复合类型的类型:
spa

      记录和表
code


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;

  

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

相关文章
相关标签/搜索