ORACLE中使用%TYPE和%ROWTYPE定义变量的类型

ORACLE中使用%TYPE和%ROWTYPE定义变量的类型

一、%TYPE的用法

定义变量时可以使变量与另一个已经定义好的变量(通常是表中的一列)的数据类型保持一致,可以使用%Type的方式。使用%Type定义变量的好处是:当被参照的那个变量的数据类型发生变化时,该变量的数据类型也会随着发生变化,该变量的类型不由自己决定,而是由与之关联的对象决定。

例如:输入一个部门的编号,显示出这个部门的名称,总人数,平均工资。

SQL> 
declare
    d_no dept.deptno%type;
    d_name dept.dname%type;
    emp_count number;
    avg_sal number;
begin
    d_no:=&dno;
    select dname into d_name
    from dept
    where deptno=d_no;

    select count(*),avg(sal) 
    into emp_count,avg_sal
    from emp
    where deptno=d_no;
    dbms_output.put_line('该部门名称:'||d_name);
    dbms_output.put_line('该部门员工人数:'||emp_count);
    dbms_output.put_line('该部门平均工资:'||avg_sal);
exception
    when no_data_found then
        dbms_output.put_line('该部门不存在或者该部门没有员工!');  
end;
/
Enter value for dno: 20
old   7:     d_no:=&dno;
new   7:     d_no:=20;
该部门名称:RESEARCH
该部门员工人数:5
该部门平均工资:2175

PL/SQL procedure successfully completed.

二、%RowType的用法

使用%ROWTYPE可以定义一个表示表中一行记录的变量,如果表中的某些列数据类型发生改变,新变量的数据类型会自动跟随其改变。
使用%ROWTYPE定义的记录变量可以保存从一个表或游标中查询到的整个数据行的各列数据。记录变量的各个列与表中行的各个列有相同的名称和数据类型。

例如:上面的例子也可以这样进行修改

SQL> 
declare
    r_dept dept%rowtype;
    emp_count number;
    avg_sal number;
begin
    r_dept.deptno:=&dno;
    select * into r_dept
    from dept
    where deptno=r_dept.deptno;
 10  
    select count(*),avg(sal) 
    into emp_count,avg_sal
    from emp
    where deptno=r_dept.deptno;
    dbms_output.put_line('该部门名称:'||r_dept.dname);
    dbms_output.put_line('该部门员工人数:'||emp_count);
    dbms_output.put_line('该部门平均工资:'||avg_sal);
exception
    when no_data_found then
        dbms_output.put_line('该部门不存在或者该部门没有员工!');  
end;
 22  /
Enter value for dno: 20
old   6:     r_dept.deptno:=&dno;
new   6:     r_dept.deptno:=20;
该部门名称:RESEARCH
该部门员工人数:5
该部门平均工资:2175

PL/SQL procedure successfully completed.

例如:输入一个雇员的编号,把他的领导的ename、sal、comm显示出来

SQL> 
declare
    r_emp emp%rowtype;
    e_no emp.empno%type;
begin
    e_no:=&empno;
    select * 
    into r_emp 
    from emp
    where mgr in (select mgr 
                  from emp
                  where empno=e_no)
          and empno<>e_no;
    dbms_output.put_line('领导的姓名:'||r_emp.ename);
    dbms_output.put_line('领导的工资:'||r_emp.sal);
    dbms_output.put_line('领导的奖金:'||r_emp.comm);
exception
    when no_data_found then 
        dbms_output.put_line('雇员不存在或者该雇员没有领导!');
end;
 20  /
Enter value for empno: 7788
old   5:     e_no:=&empno;
new   5:     e_no:=7788;
领导的姓名:FORD
领导的工资:3000
领导的奖金:

PL/SQL procedure successfully completed.

你可能感兴趣的:(Oracle基本操作)