在数据库开发过程中,对于一定数据量的数据,是可以用游标配合循环进行批量处理一些数据。游标我自己理解的是一块目标数据的缓存。
1.弱类型 ref cursor create or replace function selecvtallemployments return sys_refcursor -- 定义一个返回sys_refcursor的函数 as st_cursor sya_refcursor; begin open st_cursor for select * from emp; --返回游标的指针 return st_cursor; end;
2. 使用引用游标 declare x sys_refcursor; --定义引用游标变量 v_emp emp%rowtype; -- 定义获取游标结果的记录类型 begin x:=selectallemployments; -- 调用函数获取游标指针 -- 循环遍历游标指针 loop fetch x into v_emp; -- 当没找到游标记录时则退出 exit when x%notfound; --输出记录信息 dbms_output.put_line('员工编号:' ||v-emp.empno ||'员工名称': ||v_emp.ename ); end loop; end;
3. 用户子类型使用引用游标 declare subtype empcounttype is interger; -- 定义子类型 empcount empcounttype; --声明子类型变量 begin select count(*) -- 查询emp表为子类型变量赋值 into empcount from emp; -- 输出员工人数 dbms_output.put_line('员工人数为:'||empcount); end;
4.子类型 declare type empnamelist is table of varchar2(20); --定义表类型 --定义表类型的子类型 subtype namelist is empnamelaist; -- 定义员工记录 type emprec is record( empno number(4), ename varchar2(20) ); -- 定义员工记录子类型 subtype emprecord is emprec; -- 定义数据库表emp 中的empno 列类型 subtype empno is emp.empno%type; --定义数据库表emp 中的行记录子类型 subtype emprow is emp%rowtype; begin null; end;
5.子类型数据检查 declare subtype numtype is number(1,0);--定义子类型 --定义子类型变量 x_value numtype; y_value numtype; begin x_value :=3; -- 正常 y_value :=10; -- 弹出异常提示 end;
6. 为约束类型 declare subtype numtype is number; -- 定义类型和数量 c_value number; y_value numtype; begin x_value :=10; -- 赋初始值 y_value :=x_value;-- 类型交换 end;
基类型相同使用
declare
subtype numtype is varchar2(200); --定义类型和变量
x_value varchar2(20);
y_value numtype;
begin
x_value:=' this is a word'; --赋初值
y_value :=v_value; --类型交换
end;
7. 显示装换、 declare v_startdate date; -- 起始日期 v_enddate date; --结束日期 v_resultdate number; --返回结果 begin --起始日期,将字符串转换为日期 v_startdate :=to_date('2007-10-11','yyyy-mm-dd'); v_enddate :=trunc(syadate); --赋日期值 v_resultdate :=v_enddate=v_startdate; --进行日期转换 -- 输出二者相差天数 dbms_output.put_line('起始日期:' ||to_char(v_startdate,'yyyy-mm-dd') ||chr(13) ||chr(10) ||'结束日期:' ||to_char(v_enddate,'yyyy-mm-dd') ||chr(13) ||chr(10) ||'相差天数:' ||to_char(v_resultdate) ); end;
8. 隐式转换 declare v_startdate char(10); --起始日期 v_enddate char(10); --结束如期 v_reslut number(5); begin select min(hiredate) into v_startdate from emp; -- 自动转换为字符型 select trunc(sysdate) into v_enddate from dual; -- 输出2者相差天数 dbms_output.put_line('起始日期:' ||v_startdate ||chr(13) ||chr(10) ||'结束日期:' ||v_enddate ); v_startdate:='200'; -- 为字符串赋值 v_enddate:='400'; v_result:=v_enddate-v_startdate;--对字符串进行运算 end;
10. 表达式赋值 declare v_sal number; --定义变量 v_result number; begin select sal into v_sal --为变量赋值 from emp where empno=&empno; v_result :=v_sal *(1+0.15); --使用表达式赋值 end;