Welcome 微信登录

首页 / 数据库 / MySQL / Oracle 11g Release 1 (11.1) PL/SQL_理解 Record 类型

本文内容

  • 定义和声明 Record
  • Record 作为子程序参数和函数返回值
  • 给 Record 赋值
  • 比较 Record
  • 把 Record 插入到数据库
  • 把 Record 更新到数据库
  • Record 插入和更新的约束
  • 把查询数据放到 Record  

定义和声明 Record

若创建 records,需要先定义一个 RECORD 类型,再用该类型声明变量。也可以创建或查找一个表、视图,或 PL/SQL 游标,总之是你想要的值,使用 %ROWTYPE 属性来创建匹配的 Record。你可以在任何 PL/SQL 块、子程序或包的声明部分定义 RECORD 类型。当你自定义 RECORD 类型时,不能在域上指定一个 NOT NULL 的约束,或给出它们的默认值。示例 1:演示声明和初始化一个简单的 Record 类型DECLARE TYPE DeptRecTyp IS RECORD (deptid NUMBER(4) NOT NULL := 99,dnamedepartments.department_name%TYPE,locdepartments.location_id%TYPE,region regions%ROWTYPE ); dept_rec DeptRecTyp;BEGIN dept_rec.dname := "PURCHASING";END;/示例 2:演示声明和初始化 Record 类型DECLARE-- Declare a record type with 3 fields.TYPE rec1_t IS RECORD(field1 VARCHAR2(16), field2 NUMBER, field3 DATE);-- For any fields declared NOT NULL, you must supply a default value.TYPE rec2_t IS RECORD (id INTEGER NOT NULL := -1, name VARCHAR2(64) NOT NULL := "[anonymous]");-- Declare record variables of the types declaredrec1 rec1_t;rec2 rec2_t;-- Declare a record variable that can hold-- a row from the EMPLOYEES table.-- The fields of the record automatically match the names and-- types of the columns.-- Don"t need a TYPE declaration in this case.rec3 employees%ROWTYPE;-- Or mix fields that are table columns with user-defined fields.TYPE rec4_t IS RECORD (first_name employees.first_name%TYPE, last_name employees.last_name%TYPE, rating NUMBER);rec4 rec4_t;BEGIN-- Read and write fields using dot notationrec1.field1 := "Yesterday";rec1.field2 := 65;rec1.field3 := TRUNC(SYSDATE-1);-- Didn"t fill name field, so it takes default valueDBMS_OUTPUT.PUT_LINE(rec2.name);END;/
若在数据库存储一个 Record,你可以在 INSERTUPDATE 语句指定,只要它的域与表的列匹配。你可以使用 %TYPE 来指定 Record 域类型对应表的列的类型。即使列类型改变了,你的代码仍然可以运行。例如,增加了 VARCHAR2 字段的长度,或 NUMBER 字段的精度。
示例 3:演示使用 %ROWTYPE 来声明一个 Record,来保存 department 表的信息DECLARE-- Best: use %ROWTYPE instead of specifying each column.-- Use <cursor>%ROWTYPE instead of <table>%ROWTYPE because -- you only want some columns.-- Declaring cursor doesn"t run query or affect performance. CURSOR c1 IS SELECT department_id, department_name, location_id FROM departments; rec1 c1%ROWTYPE;-- Use <column>%TYPE in field declarations to avoid problems if -- the column types change. TYPE DeptRec2 IS RECORD (dept_id departments.department_id%TYPE,dept_name departments.department_name%TYPE,dept_locdepartments.location_id%TYPE); rec2 DeptRec2;-- Write each field name, specifying type directly-- (clumsy and unmaintainable for working with table data-- use only for all-PL/SQL code). TYPE DeptRec3 IS RECORD (dept_id NUMBER,dept_name VARCHAR2(14),dept_loc VARCHAR2(13)); rec3 DeptRec3;BEGIN NULL;END;/
PL/SQL 可以定义包含对象、集合和其他 Record(内置 Record)的 Record。但 Record 不能是对象类型的属性。若声明一个 Record,表示数据库表的一行,则无需列出列,使用 %ROWTYPE 属性。当表添加列后,你的代码仍然可以运行。若你想表示一个表列的一个子集,或是不同表的列,则你可以定义一个视图或声明一个游标,来选择右边的列,执行任何需要的连接,再在视图或游标上应用 %ROWTYPE
 
  • 1
  • 2
  • 3
  • 下一页
Oracle 11g Release 1 (11.1) PL/SQL_理解 Collection 类型Oracle 11g Release 1 (11.1) PL/SQL_了解静态和动态 SQL相关资讯      Oracle存储过程 
  • Oracle存储过程拼接in语句 & 自定  (今 09:21)
  • 【PL/SQL系列】Oracle存储过程使用  (04月23日)
  • Oracle存储过程及Java调用  (05/28/2015 20:29:33)
  • Java调用Oracle存储过程返回多条结  (04月29日)
  • Oracle中的存储过程简单应用  (04月10日)
  • 判断点是否落在面中的Oracle存储过  (05/09/2015 09:39:30)
本文评论 查看全部评论 (0)
表情: 姓名: 字数


评论声明
  • 尊重网上道