oracle 中 有两个type
Oracle 自定义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环境中使用的,比如建表时。
5、自定义类型。
***********************一个type 就像是复合变量: 个人理解这个type 就是一个数组一样,不过他返回值只有一个值。而且需要赋值。
例1:
DECLARE
TYPE t1 IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE t2 IS TABLE OF DATE INDEX BY BINARY_INTEGER;
type t3 is table of varchar2(10) index by binary_integer;
v1 t1;
v2 t2;
v3 t3;
BEGIN
v1(1) := 'CAMERON';
v2(8) := SYSDATE + 7;
select ename,hiredate into v1(7900),v2(7900) from emp where empno=7900;
v1(555) :='AAAA';
v2(666) :=sysdate-100;
v3(1):='test';
dbms_output.put_line(v1(1)||' '||v1(7900)||v2(666));
dbms_output.put_line(v2(8)||' '||v2(7900)||v1(555));
dbms_output.put_line(v3(1));
END;
/
例2:
使用集合的属性来操作集合的数据
– NEXT
– TRIM
– DELETE
– EXISTS
– COUNT
– FIRST and LAST
– PRIOR
DECLARE
TYPE t2 IS TABLE OF dept%rowtype INDEX BY BINARY_INTEGER;
v2 t2;
n1 number(3);n2 number(3);n3 number(3);n4 number(3);n5 number(3);n6 number(3);
BEGIN
select * into v2(10) from dept where deptno=10;
select * into v2(20) from dept where deptno=20;
select * into v2(30) from dept where deptno=30;
select * into v2(40) from dept where deptno=40;
n1:=v2.first;--第一号元素
n2:=v2.last;--最后一个元素
n3:=v2.count;--共有多少个元素
n4:=v2.PRIOR(20);--20号的前一个为几号
n5:=v2.NEXT(20);--20号的后一个为几号
dbms_output.put_line(n1||'...'||n2||'...'||n3||'...'||n4||'...'||n5);
v2.delete(30);--将30号删除,不写几号为都删除
n6:=v2.count;
dbms_output.put_line(n6);
END;
/
例3:成员为复合变量,每个主键访问一行数据
DECLARE
TYPE t1 IS TABLE OF emp%rowtype
INDEX BY BINARY_INTEGER;
TYPE t2 IS TABLE OF dept%rowtype INDEX BY BINARY_INTEGER;
v1 t1;
v2 t2;
BEGIN
select * into v1(7900) from emp where empno=7900;
select * into v2(10) from dept where deptno=10;
dbms_output.put_line(v1(7900).empno||v1(7900).ename);
dbms_output.put_line(v2(10).dname);
END;
/
例4:
declare
type t_tab is table of emp%rowtype;
v_tab t_tab;
i int := 0;
v_count int;
begin
v_tab := t_tab();--用不带参数的构造函数初始化一个空表
dbms_output.put_line(v_tab.count);
dbms_output.put_line('---------------------------');
for rec in (select * from emp where empno like '7%') loop
i := i + 1;
v_tab.extend;--增加一条空表
v_tab(i).empno := rec.EMPNO;
v_tab(i).ename :=