record

  
  
  1. 记录record
  2. 基于表的记录
  3. emp%rowtype;
  4. 基于游标的记录
  5. cursor c_emp is select empno,ename from emp;
  6. rec_emp c_emp%rowtype;
  7. 用户定义的record
  8. TYPE type_name IS RECORD
  9.    (field_name1 datatype1 [NOT NULL] [ := DEFAULT EXPRESSION],
  10.     field_name2 datatype2 [NOT NULL] [ := DEFAULT EXPRESSION],
  11.     ...
  12.     field_nameN datatypeN [NOT NULL] [ := DEFAULT EXPRESSION]);
  13. record_name TYPE_NAME;
  14. declare
  15.    type rec_date_type is record (
  16.    rec_date date,
  17.    rec_day varchar2(12),
  18.    rec_time varchar2(8) := '00:00:00');
  19.    rec_d rec_date_type;
  20. begin
  21.    select sysdate into rec_d.rec_date from dual;
  22.    rec_d.rec_day := to_char(rec_d.rec_date,'Day');
  23.    rec_d.rec_time := to_char(rec_d.rec_date,'hh24:mi:ss');
  24.    dbms_output.put_line('date is '||rec_d.rec_date);
  25.    dbms_output.put_line('day is '||rec_d.rec_day);
  26.    dbms_output.put_line('time is '||rec_d.rec_time);
  27. end;
  28. /
  29. 注意:
  30. 当声明记录类型时,也许会为单个字段指定NOT NULL约束。要记得必须初始化这种字段,这一点很重要。下的范例会导致语法错误,因为某记录字段在定义NOT NULL约束后没有初始化。
  31. type sample_type is record(
  32. field1 number(3),
  33. field2 varchar2(3) not null);
  34. 正确的写法
  35. type sample_type is record(
  36. field1 number(3),
  37. field2 varchar2(3) not null := 'ABC');
  38. 记录的兼容性
  39. DECLARE
  40.  TYPE name_type1 IS RECORD(
  41.    first_name VARCHAR2(15),
  42.    last_name  VARCHAR2(30));
  43.  TYPE name_type2 IS RECORD(
  44.    first_name VARCHAR2(15),
  45.    last_name  VARCHAR2(30));
  46.  name_rec1 name_type1;
  47.  name_rec2 name_type2;
  48. BEGIN
  49.  name_rec1.first_name := 'John';
  50.  name_rec1.last_name  := 'Smith';
  51.  name_rec2            := name_rec1; -- illegal assignment
  52. END;
  53. 这上例中,两个记录拥有相同的结构,但是每个记录的类型不同。因此在记录层次中,这些记录是不兼容的,也就是说,集合赋值语句会导致错误:
  54.  name_rec2            := name_rec1; -- illegal assignment
  55.                          *
  56. ERROR at line 13:
  57. ORA-06550: line 13, column 27:
  58. PLS-00382: expression is of wrong type
  59. ORA-06550: line 13, column 3:
  60. PL/SQL: Statement ignored
  61. 为把name_rec1赋予name_rec2,可以把name_rec1的每个字段赋予name_rec2的对应字段,或者可以声明name_rec2,以便于具有与name_rec1相同的数据类型,如下所示:
  62. DECLARE
  63.  TYPE name_type1 IS RECORD(
  64.    first_name VARCHAR2(15),
  65.    last_name  VARCHAR2(30));
  66.  name_rec1 name_type1;
  67.  name_rec2 name_type1;
  68. BEGIN
  69.  name_rec1.first_name := 'John';
  70.  name_rec1.last_name  := 'Smith';
  71.  name_rec2            := name_rec1; -- no longer illegal assignment
  72. END;
  73. 上面说的赋值限制应用于用户定义记录。也就是说,可以把基于表或者基于游标的记录赋予用户定义类型,只要两者具有相同的结构
  74. DECLARE
  75.  CURSOR course_cur IS
  76.    SELECT * FROM course WHERE rownum <= 4;
  77.  TYPE course_type IS RECORD(
  78.    course_no     NUMBER(38),
  79.    description   VARCHAR2(50),
  80.    cost          NUMBER(9, 2),
  81.    prerequisite  NUMBER(8),
  82.    created_by    VARCHAR2(30),
  83.    created_date  DATE,
  84.    modified_by   VARCHAR2(30),
  85.    modified_date DATE);
  86.  course_rec1 course%ROWTYPE; -- table-based record
  87.  course_rec2 course_cur%ROWTYPE; -- cursor-based record
  88.  course_rec3 course_type; -- user-defined record
  89. BEGIN
  90.  -- Populate table-based record
  91.  SELECT * INTO course_rec1 FROM course WHERE course_no = 10;
  92.  -- Populate cursor-based record
  93.  OPEN course_cur;
  94.  LOOP
  95.    FETCH course_cur
  96.      INTO course_rec2;
  97.    EXIT WHEN course_cur%NOTFOUND;
  98.  END LOOP;
  99.  course_rec1 := course_rec2;
  100.  course_rec3 := course_rec2;
  101. END;
  102. 嵌套记录
  103. DECLARE
  104.  TYPE name_type IS RECORD(
  105.    first_name VARCHAR2(15),
  106.    last_name  VARCHAR2(30));
  107.  TYPE person_type IS RECORD(
  108.    name   name_type,
  109.    street VARCHAR2(50),
  110.    city   VARCHAR2(25),
  111.    state  VARCHAR2(2),
  112.    zip    VARCHAR2(5));
  113.  person_rec person_type;
  114. BEGIN
  115.  SELECT first_name, last_name, street_address, city, state, zip
  116.    INTO person_rec.name.first_name,
  117.         person_rec.name.last_name,
  118.         person_rec.street,
  119.         person_rec.city,
  120.         person_rec.state,
  121.         person_rec.zip
  122.    FROM student
  123.    JOIN zipcode
  124.   USING (zip)
  125.   WHERE rownum < 2;
  126.  DBMS_OUTPUT.PUT_LINE('Name: ' || person_rec.name.first_name || ' ' ||
  127.                       person_rec.name.last_name);
  128.  DBMS_OUTPUT.PUT_LINE('Street: ' || person_rec.street);
  129.  DBMS_OUTPUT.PUT_LINE('City: ' || person_rec.city);
  130.  DBMS_OUTPUT.PUT_LINE('State: ' || person_rec.state);
  131.  DBMS_OUTPUT.PUT_LINE('Zip: ' || person_rec.zip);
  132. END;
  133. enclosing_record.(nested_record or nested_collection).field_name
  134. 记录的集合
  135. DECLARE
  136.   CURSOR name_cur IS
  137.      SELECT first_name, last_name
  138.        FROM student
  139.       WHERE ROWNUM <= 4;
  140.   TYPE name_type IS TABLE OF name_cur%ROWTYPE
  141.      INDEX BY BINARY_INTEGER;
  142.   name_tab  name_type;
  143.   v_counter INTEGER := 0;
  144. BEGIN
  145.   FOR name_rec IN name_cur LOOP
  146.      v_counter := v_counter + 1;
  147.      name_tab(v_counter).first_name := name_rec.first_name;
  148.      name_tab(v_counter).last_name := name_rec.last_name;
  149.      DBMS_OUTPUT.PUT_LINE('First Name('||v_counter||'): '||
  150.         name_tab(v_counter).first_name);
  151.      DBMS_OUTPUT.PUT_LINE('Last Name('||v_counter||'): '||
  152.         name_tab(v_counter).last_name);
  153.   END LOOP;
  154. END;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值