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 := #
“mcode”是绑定变量,不应该声明,但是需要声明 mbranch_code
以上是关于PL/SQL数据类型的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 PL/SQL:ORA-00932:不一致的数据类型:预期的 CLOB 得到了 -