1.3 变量

  在数据库开发过程中,对于一定数据量的数据,是可以用游标配合循环进行批量处理一些数据。游标我自己理解的是一块目标数据的缓存。

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;
原文地址:https://www.cnblogs.com/etllearn/p/15035938.html