Oracle 自定义数据类型Type
2015-08-21 11:47
519 查看
引言
这个月项目中实现了一个动态汇总并且导出到Excel的功能,妈蛋,为了实现这个功能,一个网格页面就用了20+个存储过程和自定义函数,终于完成了初步测试工作,其中快把我所掌握的不掌握的Oracle知识都快用完了,其中有行转列(XML)、列转行、动态表、动态SQL、自定义Type、管道函数、数据流函数等,为了加深印象,便于梳理自己的知识体系,也给一些需要的人一些帮助吧,先从自定义数据类型开始总结。Oracle 自定义类型的种类
记录数据类型(Record)和记录表类型(Table),其中记录数据类型Record存储是一条记录,记录表类型Table用来存储多条记录。如果记录数据类型Record是一维数组的话,记录表类型Table就是二维数组。自定义类型有两种写法:TYPE……IS和CREATE TYPE ……,两者区别在于:前者一般在存储过程和函数中定义,其作用域是所在过程或函数,而后者声明对象类型,对象类型则是作为一个数据库对象(像表、索引、视图、触发器一样,是一个数据库对象),可以过程或函数中使用,还可以在定义表时,作为字段的类型。
一、TYPE type_name IS RECORD 定义记录数据类型
定义语法:
TYPE type_name IS RECORD ( 字段名1 数据库变量类型1, 字段名2 数据库变量类型2, ... 字段名n 数据库变量类型n ); 其中type_name:自定义类型的名称
应用例子
DECLARE TYPE type_Employee IS RECORD( name VARCHAR2(100), age NUMBER(3), wage NUMBER(7,2) ); v_employs type_Employee; v_name VARCHAR2(100); v_age NUMBER(3); v_wage NUMBER(7,2); i integer; BEGIN select name, age, wage into v_employs from Employees where EmployeesId = '750adfd0-f8cd-4a64-a2f8-736f8802ec87'; v_name := v_employs.name; v_age := v_employs.age; v_wage := v_employs.wage; dbms_output.put_line(v_name); dbms_output.put_line(v_wage); dbms_output.put_line(v_age); END;
执行结果
cmo 888,888 1
二、TYPE table_Typename IS TABLE 定义表记录类型
定义语法:
TYPE table_Typename IS TABLE OF element_type INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARRAY2]; 其中: 1、table_Typename :自定义类型的名称。 2、element_type:任意数据基本类型(VARCHAR2, INGEGER, NUMBER等)、记录数据类型(即TYPE type_name IS RECORD的自定义类型)等。 3、INDEX BY:该语句的作用是使NUMBER类型的下标自增长,自动初始化,并分配空间,有了该语句,向表记录插入元素时,不需要显示初始化,也不需要通过扩展来分配空间。(必须写否则会报错,ORA-06531:Reference to uninitialized collection)
应用例子
declare TYPE type_Employee IS RECORD( name VARCHAR2(100), age NUMBER(3), wage NUMBER(8,2) ); TYPE type_Employee_Var IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER; TYPE type_Employee_Rec IS TABLE OF type_Employee INDEX BY BINARY_INTEGER; TYPE type_Employee_Rowtype IS TABLE OF Employees%ROWTYPE INDEX BY BINARY_INTEGER; v_table_name type_Employee_Var; v_table_emps type_Employee_Rec; v_table_Rwotype type_Employee_Rowtype; begin dbms_output.put_line('------------基本类型VARCHAR2表记录------------'); select name into v_table_name(1) from Employees where EmployeesId = '750adfd0-f8cd-4a64-a2f8-736f8802ec87'; select name into v_table_name(2) from Employees where EmployeesId = 'a01038ce-e6af-4ed4-806c-03ac7b26150b'; dbms_output.put_line(v_table_name(1)); dbms_output.put_line(v_table_name(2)); dbms_output.put_line('------------自定义RECORD类型表记录------------'); select name, age, wage into v_table_emps(1) from Employees where EmployeesId = '750adfd0-f8cd-4a64-a2f8-736f8802ec87'; select name, age, wage into v_table_emps(2) from Employees where EmployeesId = 'a01038ce-e6af-4ed4-806c-03ac7b26150b'; dbms_output.put_line('name:'||v_table_emps(1).name||', '||'age:'||v_table_emps(1).age||', '||'wage:'||v_table_emps(1).wage); dbms_output.put_line('name:'||v_table_emps(2).name||', '||'age:'||v_table_emps(2).age||', '||'wage:'||v_table_emps(2).wage); dbms_output.put_line('------------表记录类型表记录------------'); select * into v_table_Rwotype(1) from Employees where EmployeesId = '750adfd0-f8cd-4a64-a2f8-736f8802ec87'; select * into v_table_Rwotype(2) from Employees where EmployeesId = 'a01038ce-e6af-4ed4-806c-03ac7b26150b'; dbms_output.put_line('name:'||v_table_Rwotype(1).name||', '||'age:'||v_table_Rwotype(1).age||', '||'wage:'||v_table_Rwotype(1).wage||', '||'ranks :'||v_table_Rwotype(1).ranks ); dbms_output.put_line('name:'||v_table_Rwotype(2).name||', '||'age:'||v_table_Rwotype(2).age||', '||'wage:'||v_table_Rwotype(2).wage||', '||'ranks :'||v_table_Rwotype(2).ranks ); end; ###执行结果
输出结果:
————基本类型VARCHAR2表记录————
cmo
sbpm
————自定义RECORD类型表记录————
name:cmo, age:8, wage:888,888
name:sbpm, age:30, wage:10,000
————表记录类型表记录——————
name:cmo, age:8, wage:888,888, ranks :1
name:sbpm, age:30, wage:10,000, ranks :2
附: create or replace type tabletype as table of VARCHAR2(32676) 这张表返回一个字段 返回多个 create table t_test ( id number(10), passwd VARCHAR2(10) ); create or replace type cur_test is table of t_test;
相关文章推荐
- "ORA-00942: 表或视图不存在 "的原因和解决方法
- 在Oracle中更新数据时,抛出:ORA-01008: not all variables bound
- JAVA读取Oracle数据库BLOB字段数据文件并保存到本地文件
- Oracle数据库的启动和关闭
- SQL-Oracle异常--java.sql.SQLDataException: ORA-01861: 文字与格式字符串不匹配
- 从字符串中删除不需要的字符
- 计算字符在字符串中出现的次数
- Oracle中exp的使用2
- 在oracle中跟踪会话执行语句的几种方法
- oracle中字符中有数字的判断
- 排错记录:plsql无法连接oracle ora-12154 ora-12560
- oracle字符集结构
- oracle 解锁scott账户
- 修改Oracle数据库的字符集为UTF-8
- Oracle 学习之SQL(一) Retrieving Data Using the SQL SELECT statement
- Oracle数据库时间戳转date类型进行判断操作
- Oracle(+)号用法
- MyBatis拦截器实现mysql与oracle共用分页
- Oracle左连接、右连接、全外连接以及(+)号用法(转)
- 静默安装配置OGG Veridata 12c Agent