PL/SQL数据类型

Posted 工作在浏览器上人-YangBobin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PL/SQL数据类型相关的知识,希望对你有一定的参考价值。

一、标量类型

标量:容纳单个值,没有内部组成。

1、Number 数字类型

  • BINARY_INTEGER
  • NUMBER
  • 子类型是 DEC、DECIMAL、DOUBLE PRECISION、FLOAT、INTEGER、INT、NUMERIC、REAL、SMALLINT
  • PLS_INTEGER

2、Character 字符类型

  • CHAR:定长字符串。范围:0-32767 可选,确省=1
  • VARCHAR2:可变字符串。0-32767。默认=4000
  • RAW
  • LONG 和 LONG RAW:变长字符串
  • ROWID 和 UROWID
  • NCHAR
  • NVARCHAR2

3、Datetime 和 Interval 日期类型

  • DATE
  • TIMESTAMP
  • TIMESTAMP WITH TIME ZONE
  • TIMESTAMP WITH LOCAL TIME ZONE
  • INTERVAL YEAR TO MONTH
  • INTERVAL DAY TO SECOND

4、BOOLEAN 布尔类型

  • 用于存储逻辑值(TRUE、FALSE 和 NULL)
  • 不能向数据库中插入 BOOLEAN 数据
  • 不能将列值提取或选择到 BOOLEAN 变量中
  • 只允许对 BOOLEAN 变量执行逻辑操作

5、定义标量类型

简单语法:变量名 数据类型;
完整语法:变量名 [constant] 变量类型 [not null] [default 值 | :=值]

v1 char;
v2 varchar2(10);
v3 number;
v4 number(5);
v5 number(5,2);
v6 date;
v7 number default 10;

如果在定义变量时么可有指定初始值, 则初始化值为NULL。

6、%type,rowtype类型

%type–用于按照数据数据库或其他变量定义变量(其数据类型和长度完全一致)

表%rowtype:保存了某一行记录的所有字段的值。

oldfare fare.first_fare%TYPE;
newfare oldfare%TYPE;

emp_rec employee%ROWTYPE;--%rowtype–代表表中的行
--可以使用下列属性引用特定字段 
emp_rec.emp_num;

二、复合类型:

1、RECORD 记录类型:

一个记录类型的变量只能保存从数据库中查询出的一行记录,若查询出了多行记录,就会出现错误。

DECLARE
--定义与hr.employees表中的这几个列相同的记录数据类型
   TYPE RECORD_TYPE_EMPLOYEES IS RECORD(
        f_name   hr.employees.first_name%TYPE,
        h_date   hr.employees.hire_date%TYPE,
        j_id     hr.employees.job_id%TYPE);
--声明一个该记录数据类型的记录变量
   v_emp_record RECORD_TYPE_EMPLOYEES;
 
BEGIN
   SELECT first_name, hire_date, job_id INTO v_emp_record
   FROM employees
   WHERE employee_id = &emp_id;
 
   DBMS_OUTPUT.PUT_LINE(\'雇员名称:\'||v_emp_record.f_name
             ||\'  雇佣日期:\'||v_emp_record.h_date
             ||\'  岗位:\'||v_emp_record.j_id);
END;

2、Table 表类型:

与记录类型相似,但它是对记录类型的扩展。它可以处理多行记录,类似于高级中的二维数组,使得可以在PL/SQL中模仿数据库中的表。

Declare
  type MyRefCur  is  ref  cursor;
  vrefcur myrefcur;
  vtemp  vrefcur%rowtype;
 begin
  case(&n)
   when  1 then open vrefcur  for select   *   from emp;
   when  2 then open vrefcur  for select   *   from dept;
   else 
    open vrefcur  for select   eno,  ename  from emp where job = \'CLERK\';
  end case;

loop
    fetch  vrefcur into  vtempb;
    exit  when  vrefcur%notfound;
    dbms_output.put_line(vrefcur%rowcount||\'  \'||vtempb);
 end Loop;
close  vrefcur;
 end;

3、VARRAY 数组类型:

数组是具有相同数据类型的一组成员的集合。每个成员都有一个唯一的下标,它取决于成员在数组中的位置。

declare
--定义一个最多保存5个VARCHAR(25)数据类型成员的VARRAY数据类型
   type reg_varray_type is varray(5) of varchar(25);
--声明一个该VARRAY数据类型的变量
   v_reg_varray REG_VARRAY_TYPE;
 
begin
--用构造函数语法赋予初值
   v_reg_varray := reg_varray_type
         (\'中国\', \'美国\', \'英国\', \'日本\', \'法国\');
 
   DBMS_OUTPUT.PUT_LINE(\'地区名称:\'||v_reg_varray(1)||\'\'
                                    ||v_reg_varray(2)||\'\'
                                    ||v_reg_varray(3)||\'\'
                                    ||v_reg_varray(4));
   DBMS_OUTPUT.PUT_LINE(\'赋予初值NULL的第5个成员的值:\'||v_reg_varray(5));
--用构造函数语法赋予初值后就可以这样对成员赋值
   v_reg_varray(5) := \'法国\';
   DBMS_OUTPUT.PUT_LINE(\'第5个成员的值:\'||v_reg_varray(5));
end;

4、NESTED TABLE:

三、参照类型:

1、REF CURSOR: REF游标类型:

REF游标变量是一种 引用 REF游标类型 的变量,指向动态关联的结果集

Declare
  type MyRefCur  is  ref  cursor;
  vrefcur myrefcur;
  vtemp  vrefcur%rowtype;
 begin
  case(&n)
   when  1 then open vrefcur  for select   *   from emp;
   when  2 then open vrefcur  for select   *   from dept;
   else 
    open vrefcur  for select   eno,  ename  from emp where job = \'CLERK\';
  end case;

loop
    fetch  vrefcur into  vtempb;
    exit  when  vrefcur%notfound;
    dbms_output.put_line(vrefcur%rowcount||\'  \'||vtempb);
 end Loop;
close  vrefcur;
 end;

2、REF操作符

四、LOB类型:

1、BFILE (Movie)

存放大的二进制数据对象,这些数据文件不放在数据库里,而是放在操作系统的某个目录里,数据库的表里只存放文件的目录。

2、BLOB(Photo)

存储大的二进制数据类型。变量存储大的二进制对象的位置。大二进制对象的大小<=4GB。

3、CLOB(Book)

存储大的字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。

4、NCLOB

存储大的NCHAR字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。

五、pl/sql变量声明和复制。

变量为数据的临时存储

  • 变量在声明部分中声明,可以在 SQL 语句和过程语句中使用、在可执行部分中赋予新值。
  • 变量的作用域为变量声明开始到当前语句块结束。
DECLARE 
   declarations ——定义常量,变量,函数、复杂数据类型、游标和异常处理名称等
BEGIN        
   executable statements ——PL/SQL语句和SQL语句
EXCEPTION
   handlers
END;

1、变量声明

oldfare NUMBER(5);
m_name VARCHAR(15);
cont BOOLEAN;

2、赋值

oracle中变量赋值方式是值复制而非引用 ,通过使用赋值操作符“:=”,将变量放在“:=”左侧,而将包含数据量、变量、算术操作符或 PL/SQL 函数调用的表达式放置在右侧来对变量赋值。示例

emp_rec.dept_code := ‘MKTG’;
num := 100;

1、还可以按如下方法使用 SELECT INTO 对变量赋值
SELECT <列名> INTO <变量名> FROM <表名> WHERE <条件>;
示例

SELECT first_fare INTO oldfare
FROM fare WHERE route_code = ‘SAN-LOU’;

SELECT 语句执行后,仅当它检索一行时,SELECT 才成功操作 ,检索了多行和不检索任何行的情况将导致错误并产生异常处理程序 。

2、使用“&”操作符及赋值操作符可以接受用户输入的值

mbranch_code :=&mcode’;
num := &num;

“mcode”是绑定变量,不应该声明,但是需要声明 mbranch_code

以上是关于PL/SQL数据类型的主要内容,如果未能解决你的问题,请参考以下文章

(十七)PL/SQL DBMS输出

从 PL/SQL 函数返回表 - 不正确的数据类型

如何修复 PL/SQL:ORA-00932:不一致的数据类型:预期的 CLOB 得到了 -

从 pl/sql 中的函数返回数据作为光标而不创建类型 oracle 11g

PL/SQL数据类型

SQL记录-PLSQL基本语法与数据类型