PLSQL的两个属性类型%type 和%rowtype

1.%type

定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE。
说白了就是将查询到的某个列的结果要赋给 一个变量这会就用到了 %TYPE

例:

---查询员工号为7369的补助
declare
empcom emp.comm%type ;  --声明一个empcom变量 
begin
   select comm into empcom from emp where empno=7369 ;---将查到的comm类型的结果值放到 empcom变量里 
   dbms_output.put_line('员工补助是'||empcom) ;--- ||是连接字符用到
end ;
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

declare 声明部分定义了一个empcom 变量它的类型是 emp的comm属性,意味着 后边的程序将列值取出赋值给empcom 变量。
select comm into empcom from emp where empno=7369 ;
select … into… 表示将 查询结果 赋给 empcom 。

2.%rowtype

PL/SQL 提供%ROWTYPE操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致。
使用%ROWTYPE特性的优点在于:
所引用的数据库中列的个数和数据类型可以不必知道;
所引用的数据库中列的个数和数据类型可以实时改变。
取出一个列的记录可以存到使用rowtype 定义的变量里。

---查询king员工的所有信息。 %rowtype 使用
declare
empmsg emp%rowtype ; -- 定义一个empmsg变量 存一行的数据
begin
  select * into empmsg from emp where ename ='KING' ;
 dbms_output.put_line(empmsg.ename||':'||empmsg.sal) ; ---输出
end ; 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

以下内容转载自https://blog.csdn.net/wuya814070935/article/details/73835630

%TYPE概念:

为了使一个变量的数据类型与另一个已经定义了的变量(尤其是表的某一列)的数据类型相一致,Oracle提供了%TYPE定义方式。当被参照的那个变量的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL程序了。当不能确切地知道被参照的那个变量的数据类型时,就只能采用这种方法定义变量的数据类型。

使用%TYPE特性的优点在于:

  • 所引用的数据库列的数据类型可以不必知道。
  • 所引用的数据库列的数据类型可以实时改变。

%ROWTYPE概念:

如果一个表有较多的列,使用%ROWTYPE来定义一个表示表中一行记录的变量,比分别使用%TYPE来定义表示表中各个列的变量要简洁得多,并且不容易遗漏、出错。这样会增加程序的可维护性。

为了使一个变量的数据类型与一个表中记录的各个列的数据类型相对应、一致,Oracle提供%ROWTYPE定义方式。当表的某些列的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL程序了。当不能确切地知道被参照的那个表的结构及其数据类型时,就只能采用这种方法定义变量的数据类型。

一行记录可以保存从一个表或游标中查询到的整个数据行的各列数据。一行记录的各个列与表中一行的各个列有相同的名称和数据类型。

使用%ROWTYPE特性的优点在于:

  • 所引用的数据库中列的个数和数据类型可以不必知道。
  • 所引用的数据库中列的个数和数据类型可以实时改变。

简单实例

--学生结构表
CREATE TABLE STUDENT
(
ID INT NOT NULL, --学生主键ID
NAME VARCHAR2(50),--学生名称
SEX INT --学生性别 0='男' 1='女'
);

--学生信息
INSERT INTO STUDENT(ID, NAME, sex) VALUES(1, 'mike',0);
INSERT INTO STUDENT(ID, NAME, sex) VALUES(2, 'vancy',1);

--%TYPE实例1,简单写法
DECLARE
  V_NAME STUDENT.NAME%TYPE; --与NAME类型相同
  V_SEX STUDENT.SEX%TYPE; --与SEX类型相同
BEGIN
  SELECT t.name,t.sex INTO V_NAME,V_SEX
  FROM STUDENT t
  WHERE t.id = &ID;
  DBMS_OUTPUT.put_line('学生姓名:' || V_NAME);
  DBMS_OUTPUT.put_line('学生性别:' || V_SEX);
END;

--%TYPE实例2,结合type自定义类型使用
DECLARE
  --定义一个记录类型
  TYPE STUINFO_RECORD IS RECORD(
     V_NAME STUDENT.NAME%TYPE, --与NAME类型相同
     V_SEX STUDENT.SEX%TYPE --与SEX类型相同
  );
  --声明自定义记录类型变量
  V_STUINFO_RECORD STUINFO_RECORD;
BEGIN
  SELECT t.name,t.sex INTO V_STUINFO_RECORD
  FROM STUDENT t
  WHERE t.id = &ID;
  DBMS_OUTPUT.put_line('学生姓名:' || V_STUINFO_RECORD.V_NAME);
  DBMS_OUTPUT.put_line('学生性别:' || V_STUINFO_RECORD.V_SEX);
END;

--%ROWTYPE实例
DECLARE 
  V_STUDENT STUDENT%ROWTYPE; --与STUDENT表中的各个列相同
BEGIN
  SELECT * INTO V_STUDENT
  FROM STUDENT t
  WHERE t.id=&ID;
  DBMS_OUTPUT.PUT_LINE('学生ID:' || V_STUDENT.ID);
  DBMS_OUTPUT.put_line('学生姓名:' || V_STUDENT.NAME);
  DBMS_OUTPUT.put_line('学生性别:' || V_STUDENT.SEX);
END;
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 PL/SQL 中,可以使用以下方法将一个 TYPE 类型的字段赋值给另一个字段: 1. 使用 %TYPE 关键字 可以使用 %TYPE 关键字来声明一个变量与另一个变量或数据库列具有相同的数据类型。在这种情况下,可以使用该类型的字段直接对变量进行赋值。例如: DECLARE TYPE employee_rec_type IS RECORD ( employee_id employees.employee_id%TYPE, first_name employees.first_name%TYPE, last_name employees.last_name%TYPE, hire_date employees.hire_date%TYPE, job_id employees.job_id%TYPE, salary employees.salary%TYPE ); v_employee1 employee_rec_type; v_employee2 employee_rec_type; BEGIN SELECT * INTO v_employee1 FROM employees WHERE employee_id = 100; v_employee2.employee_id := v_employee1.employee_id; v_employee2.first_name := v_employee1.first_name; v_employee2.last_name := v_employee1.last_name; v_employee2.hire_date := v_employee1.hire_date; v_employee2.job_id := v_employee1.job_id; v_employee2.salary := v_employee1.salary; -- 在此处可以直接使用 v_employee2 行变量中的字段进行后续操作 END; 2. 使用 %ROWTYPE 关键字 可以使用 %ROWTYPE 关键字来声明一个变量与另一个表或游标具有相同的列结构。在这种情况下,可以使用该类型的字段直接对变量进行赋值。例如: DECLARE TYPE employee_rec_type IS RECORD ( employee_id employees.employee_id%TYPE, first_name employees.first_name%TYPE, last_name employees.last_name%TYPE, hire_date employees.hire_date%TYPE, job_id employees.job_id%TYPE, salary employees.salary%TYPE ); v_employee1 employees%ROWTYPE; v_employee2 employee_rec_type; BEGIN SELECT * INTO v_employee1 FROM employees WHERE employee_id = 100; v_employee2 := v_employee1; -- 在此处可以直接使用 v_employee2 行变量中的字段进行后续操作 END; 无论是使用 %TYPE 还是 %ROWTYPE,都需要保证字段顺序与类型定义的顺序相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值