Oracle PL/SQL中的%TYPE和%ROWTYPE特性

今天看到项目中存在这两种存储过程中SQL高级用法,特意记录一下。在 Oracle PL/SQL 里,%TYPE 和 %ROWTYPE 是相当实用的特性,它们能够提升代码的可维护性与灵活性

%TYPE 特性

%TYPE 特性可用于声明一个变量,其数据类型和长度与另一个已定义的变量或者数据库表的列相同

  • 当表结构改变时,无需手动修改变量的数据类型

语法结构variable_name table_name.column_name%TYPE;

DECLARE
    -- 声明一个变量 emp_salary,其数据类型与 employees 表的 salary 列相同
    emp_salary employees.salary%TYPE;
BEGIN
    -- 查询 employees 表中员工 ID 为 100 的员工的工资
    SELECT salary INTO emp_salary FROM employees WHERE employee_id = 100;
    UPDATE employees SET salary = emp_salary WHERE employee_id = 101;
    COMMIT;
END;

%ROWTYPE 特性

%ROWTYPE 特性可用于声明一个记录类型的变量,该变量能存储表中一行的数据,变量的每个字段与表的列具有相同的数据类型和长度

语法结构variable_name table_name%ROWTYPE;

DECLARE
    -- 声明一个记录类型的变量 emp_record,用于存储 employees 表的一行数据
    emp_record employees%ROWTYPE;
BEGIN
    -- 查询 employees 表中员工 ID 为 100 的员工的所有信息
    SELECT * INTO emp_record FROM employees WHERE id = 100;
    -- 根据一行记录插入 employees 表
    INSERT INTO employees VALUES emp_record;
END;

-- 结合游标使用
DECLARE
  CURSOR c_emp IS
    SELECT id,first_name,last_name,phone_number,salary FROM employees;
 
  emp c%ROWTYPE;
BEGIN
  OPEN c_emp;
  LOOP
      FETCH c_emp INTO emp;
      EXIT WHEN c_emp%NOTFOUND;
      -- 更新
      UPDATE employees_salary SET name = emp.first_name ||emp.last_name WHERE id = emp.id;
      COMMIT;
  END LOOP;
  CLOSE c_emp;
END;
posted @ 2025-04-25 21:15  伊文小哥  阅读(165)  评论(0)    收藏  举报