type和create type

type和create type

异同点:
      create type 可在库中生成一个长期有效的自定义类型对象,而type作用域仅限于语句块中;
      两者都可以自定义数据类型;

各种type实例:

--【create type】*****************************************************************
--①简单 type _object--------------------------------------
create or replace type test_type01 as object(
       a varchar2(20),
       b varchar2(20),
       c number(10));

--②简单 type _varray--------------------------------------
create or replace type test_type02 as varray(10) of test_type01;

--③简单 type _table--------------------------------------
create or replace type test_type03 as table of test_type02;

--④创建带映射函数的【object】类型
--create type as object(member) --------------------------------------
create or replace type test_type01 as object (
       a varchar2(10),
       b varchar2(10),
       member function aaa(a in varchar2,b in varchar2) return varchar2
       );
create or replace type body test_type01 as
       member function aaa(a in varchar2,b in varchar2) return varchar2 is
       begin
           return a||b;
       end;
end;
--用法一:create table of type
create table test_type_table01 of test_type01;
insert into test_type_table01 values(‘a‘,‘a‘);
insert into test_type_table01 select test_type01(‘1‘,‘1‘) from dual;
commit;

select * from test_type_table01;
select ee.a,ee.aaa(‘dd‘,‘ee‘) from test_type_table01 ee;

--用法二:create table(typename.type)
create table test_type_table02(
       a number(10),
       test_t test_type01
       );
insert into test_type_table02 values(1,test_type01(‘a‘,‘a‘));
insert into test_type_table02 select 2,test_type01(‘b‘,‘b‘) from dual;
commit;

select * from test_type_table02;
select rr.a,rr.test_t,rr.test_t.a,rr.test_t.aaa(‘dd‘,‘ee‘) from test_type_table02 rr;

--⑤创建【table】类型
--create type as table --------------------------------------
--用法一:
create or replace type test_type02 as object (
       a varchar2(10),
       b varchar2(10)
       ) not final;
create or replace type test_type03 as table of test_type02;

create table test_type_table03(
       id number(10),
       test_ty test_type03
       )nested table test_ty store as test_ty_table;--test_ty_table表示嵌套表【名称可随意取?】;

insert into test_type_table03 values(1,test_type03(test_type02(‘a‘,‘a‘)));
insert into test_type_table03 select 2,test_type03(test_type02(‘b‘,‘b‘),test_type02(‘c‘,‘c‘)) from dual;
commit;

select * from test_type_table03;
select aa.id,aa.test_ty from test_type_table03 aa;
select * from table(select aa.test_ty from test_type_table03 aa where aa.id=2);
/*       --无效sql
select * from table(select aa.test_ty from test_type_table03 aa where aa.id in(1,2));--ORA-01427: 单行子查询返回多个行
select * from test_ty_table;--ORA-22812: 无法参考嵌套表列的存储表
truncate table test_type_table03;--truncate 无效,因为其中有集合
*/

--用法二:
create or replace type test_type04 as table of varchar2(10);--varchar2要限定字符数,否则会报错
create or replace type test_type05 as object(
       a number(10),
       test_ test_type04
       );
create table test_type_table02 of test_type05
       nested table test_ store as test_ty_table02;--test_为【table】类型的变量    

/*--在用法二下这种定义表的语句不被允许,是因为test_type05为object?
create table test_type_table04(
       id number(10),
       test_t test_type05
       )nested table test_ store as test_ty_table02;
*/

insert into test_type_table02 values(test_type05(1,test_type04(‘a‘)));
insert into test_type_table02 select test_type05(2,test_type04(‘b‘,‘c‘)) from dual;
commit;

drop table test_type_table02;
drop type test_type04;
drop type test_type05;

select * from test_type_table02;
select * from table(select tt.test_ from test_type_table02 tt where tt.a=2);
select aa.a,aa.test_ from test_type_table02 aa;

--⑥创建【varray】类型
--create type as varray --------------------------------------
create or replace type test_type07 as varray(4) of varchar2(10);

create table test_type_table03(
       id number(10),
       test_ test_type07
       );

insert into test_type_table03 values(1,test_type07(‘a‘));
insert into test_type_table03
       select 2,test_type07(‘b‘,‘c‘) from dual
       union all
       select 3,test_type07(‘d‘,‘e‘,‘f‘) from dual;
commit;
select * from test_type_table03;
select kk.* from table(select tt.test_ from test_type_table03 tt where id=3) kk;

--⑦创建混合自定义类型
create or replace type test_type08 as varray(4) of varchar2(10);
create or replace type test_type09 as table of varchar2(10);--varchar2要限定字符数,否则会报错
create or replace type test_type10 as object(
       a number(10),
       test_ test_type08,
       test_1 test_type09
       );

create table test_type_table05 of test_type10
       nested table test_1 store as test_ty_table05;
insert into test_type_table05 values(1,test_type08(‘a‘),test_type09(‘a‘));
insert into test_type_table05 select 2,test_type08(‘b‘,‘c‘),test_type09(‘b‘) from dual;
--注意以下两种写法,效果相同
insert into test_type_table05 select test_type10(3,test_type08(‘b‘,‘c‘,‘d‘,‘e‘),test_type09(‘c‘,‘d‘)) from dual;
insert into test_type_table05 select 4,test_type08(‘b‘,‘c‘,‘d‘,‘e‘),test_type09(‘c‘,‘d‘) from dual;

select * from test_type_table05;
select * from table(select tt.test_ from test_type_table05 tt where tt.a=3);
select * from table(select tt.test_1 from test_type_table05 tt where tt.a=3);

--【type】*****************************************************************
--①简单 type _object--------------------------------------
declare type test_type_ is record(
       a emp.empno%type,
       b emp.ename%type,
       c emp.job%type);
       test_ test_type_;
begin
       test_.a:=123;
       test_.b:=‘abc‘;
       test_.c:=‘def‘;
       dbms_output.put_line(test_.a||test_.b||test_.c);
       select empno,ename,job into test_ from emp where empno=‘7369‘;
       dbms_output.put_line(test_.a||test_.b||test_.c);
end;
--②简单 type _varray--------------------------------------
declare
      type test_type_02 is varray(5) of varchar2(10);
      test_ test_type_02;
begin
      test_:=test_type_02(‘a‘,‘b‘,‘c‘,‘d‘);
      dbms_output.put_line(test_(1)||test_(2)||test_(3)||test_(4));
end;

--③简单 type _table--------------------------------------
declare
      type test_type_03 is table of emp%rowtype;
      test_ test_type_03;
begin
      select empno,ename,job,mgr,hiredate,sal,comm,deptno bulk collect into test_ from emp where empno=‘7369‘;
      for i in test_.first..test_.last loop
          dbms_output.put_line(test_(i).empno||test_(i).ename||test_(i).job);
      end loop;
end;

--【type ref cursor】*****************************************************************
--①强类型和弱类型ref游标--------------------------------------
declare
  --弱类型ref游标
  type test_type is ref cursor;
  --强类型ref游标(有return返回值)
  type test_type_ is ref cursor return emp%rowtype;
  test_ test_type;
  test__ test_type_;
  emp_ emp%rowtype;
  emp__ emp%rowtype;
begin
  open test_ for select * from emp;
  loop
       fetch test_ into emp_;
       dbms_output.put_line(emp_.ename);
       exit when test_%notfound;
  end loop;
  close test_;
  dbms_output.put_line(‘##############################‘);
  open test__ for select * from emp;
  loop
       fetch test__ into emp__;
       dbms_output.put_line(emp__.ename);
       exit when test__%notfound;
  end loop;
  close test__;
end;

--②将ref游标作为返回值--------------------------------------
--创建函数(返回游标)
create or replace function test_func_ref return sys_refcursor as
       test_ref sys_refcursor;
begin
       open test_ref for select * from emp;
       return test_ref;
end;
--调用函数
declare a sys_refcursor;
        b emp%rowtype;
begin
        a:=test_func_ref;
        loop
          fetch a into b;
          exit when a%notfound;
          dbms_output.put_line(b.empno);
        end loop;
end;

--sys_refcursor是9i后系统定义的一个refcursor,用于过程中返回结果集
时间: 2025-01-02 00:02:11

type和create type的相关文章

oracle 自定义类型 type / create type

一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integer.smallint. 3.日期类型.如:date.interval.timestamp. 4.PL/SQL类型.如:pls_integer.binary_integer.binary_double(10g).binary_float(10g).boolean.plsql类型是不能在sql环境中使

基础篇之 Create Type

Create Type 的话呢,是创建一个自定义的数据类型,等于说为常用的数据类型建造一个别名的样纸.然后就可以通用当前数据库的当前架构.(当然了,一般来说我们都是使用dbo架构,所以都会无事前面那个说明)╮(╯_╰)╭. 下面我来演示一下相关内容 最简单的先创建一个类型TS,然后把它查出来.虽然看起来类型是 TS,但是实际上查看变量的数据类型,还是varchar ,还是对准了基础类型.所以虽然比如我们定义了一个char(11) 的Phone 类型,又或者是一个 char(1) 的Sex,实际上

Type.MakeGenericType 方法 (Type[]) 泛型反射

替代由当前泛型类型定义的类型参数组成的类型数组的元素,并返回表示结果构造类型的 Type 对象. 命名空间:   System程序集:  mscorlib(mscorlib.dll 中) public virtual Type MakeGenericType( params Type[] typeArguments ) 参数typeArguments将代替当前泛型类型的类型参数的类型数组. 返回值Type: System.TypeType 表示的构造类型通过以下方式形成:用 typeArgume

input[type='submit']input[type='button']button等按钮在低版本的IE下面,去掉黑色边框的问题

今天做一个tabs效果的时候,发现上面的button在低版本下会出现黑色的边框,很难看,于是我整理了下几个去掉黑色边框的办法: 1.在button的外层嵌套一个div,设置button的border:none; <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <st

Hibernate中value type与entity type

在Hibernate框架中,为了更好的配合数据库,将类型分为value type和entity type. entity type特征 1.有identifier(标识符)作为类对象的唯一标识. 2.一般可以被解析为一张table(表). 3.通过identifier(标识符)可以被引用. value type特征 1.无identifier(标识符),每一个类对象都是唯一的. 2.不会被解析成一张表. 3.不会被引用,value type会被存储在entity type中. 附上Hiberna

action之间传参为中文;type=&#39;redirect&#39;和 type=&#39;redirectAction&#39;主要区别

摘录自:http://blog.csdn.net/lhi705/article/details/7446156 [html] view plain copy print? Struts2中action之间传参中文乱码的问题 解决方法一(已经验证,可以): 两个action都定义要传的参数属性的get和set方法,必须相同! 在struts.xml中定义: <result name="input" type="redirect"> <param na

swift 中Value Type VS Class Type

ios 中Value Type 和 Class Type 有哪些异同点,这个问题是在微信的公共帐号中看到的,觉得挺有意思,这里梳理一下. 1.swift 中为什么要设置值类型? 值类型在参数传递.赋值的过程中采用的是Copy的过程,copy的"值"是该值所在的内存块,相比于class类型,copy更直接,没有对象中方法调用(饮用计数.copy方法等),因此效率更高.猜测swift引入的值类型主要是为了提高效率. 2.swift 存在哪些值类型 swift中常见的值类型有 struct,

form表单重复提交,type=“button”和type=“submit”区别

公司测试提了一个项目后台在IE浏览器下(360,firefox就没问题)出现数据重复的问题,调试了好久终于发现问题所在,也不知道是谁写的代码,醉醉的.... 错误地点: <input type="submit" value="提交"  class="btn"  id="formSubmit" onclick="checkForm()"  /> type类型写成submit,而在checkForm

#define offsetof(TYPE, MEMBER) ((size_t) &amp;((TYPE *)0)-&gt;MEMBER)

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)宏的运行机理:1. ( (TYPE *)0 ) 将零转型为TYPE类型指针; 2. ((TYPE *)0)->MEMBER 访问结构中的数据成员; 3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址; 4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型.巧妙之处在于将0转 换成(TY