创建记录有以下三种方式:

  • 声明一个 RECORD 类型,然后声明一个该类型的变量。语法如下:

  • 声明一个变量,类型跟一个表的行类型关联。语法如下:

    说明

    记录的字段跟表的列名字和数据类型一一对应。

  • 说明

    记录的字段跟游标的 SELECT 查询里的列的名字和数据类型一一对应。

    示例如下:

    1. obclient> set serveroutput on;
    2. Query OK, 0 rows affected (0.00 sec)
    3. obclient> DECLARE
    4. -> TYPE T_my_rec IS RECORD(
    5. -> Code VARCHAR2(10),
    6. -> Name VARCHAR2(50) NOT NULL :='book');
    7. -> V_book T_my_rec;
    8. -> BEGIN
    9. -> V_book.code :='10000';
    10. -> V_book.name :='OceanBase PL Developer Guide';
    11. -> DBMS_OUTPUT.PUT_LINE(v_book.code||': '||v_book.name);
    12. -> END;
    13. -> /
    14. Query OK, 0 rows affected (0.04 sec)
    15. 10000: OceanBase PL Developer Guide

    注意

    对记录变量的操作和普通变量相同, 可以用 SELECT 语句对其进行赋值

示例如下:

PL 程序允许用户利用记录的值插入记录,或者更新表中的记录。 要求记录中元素的数量和类型能够表示一个完整的行。 更新记录时,利用伪列 ROW 代表匹配到的行。如下例所示:

  1. obclient> select * from regions;
  2. +-----------+------------------------+
  3. | REGION_ID | REGION_NAME |
  4. +-----------+------------------------+
  5. | 1 | Europe |
  6. | 2 | Americas |
  7. | 3 | Asia |
  8. | 4 | Middle East and Africa |
  9. +-----------+------------------------+
  10. 4 rows in set (0.00 sec)
  11. obclient> DECLARE
  12. -> TYPE region_record_type IS RECORD (
  13. -> id REGIONS.region_id%TYPE,
  14. -> name REGIONS.region_name%TYPE
  15. -> );
  16. -> region_record region_record_type;
  17. -> BEGIN
  18. -> region_record.id := 5;
  19. -> region_record.name := 'Antarctica';
  20. -> insert into REGIONS values region_record;
  21. -> region_record.id := 3;
  22. -> region_record.name := 'Asia Update';
  23. -> where REGION_ID = region_record.id;
  24. -> end;
  25. -> /
  26. Query OK, 0 rows affected (0.05 sec)
  27. obclient> select * from regions;
  28. +-----------+------------------------+
  29. | REGION_ID | REGION_NAME |
  30. +-----------+------------------------+
  31. | 1 | Europe |
  32. | 2 | Americas |
  33. | 3 | Asia Update |
  34. | 4 | Middle East and Africa |
  35. | 5 | Antarctica |
  36. +-----------+------------------------+

记录类型的变量跟其他常用数据类型的变量一样可以作为参数传递给子程序。

示例:创建和调用带记录类型参数的子程序

下面示例用两种方式定义了记录类型的变量:

最后将记录变量作为参数传递给子程序打印变量的值。

  1. delimiter /
  2. CREATE OR REPLACE PACKAGE pkg_ware_mgmt as
  3. TYPE TYPE_WARE IS RECORD(
  4. w_id ware.w_id%TYPE
  5. ,w_ytd ware.w_ytd%TYPE
  6. ,w_tax ware.w_tax%TYPE
  7. ,w_name ware.w_name%TYPE
  8. ,w_street_1 ware.w_street_1%TYPE
  9. ,w_street_2 ware.w_street_2%TYPE
  10. ,w_city ware.w_city%TYPE
  11. ,w_state ware.w_state%TYPE
  12. ,w_zip ware.w_zip%TYPE
  13. );
  14. PROCEDURE sp_record_print(p_w_id IN ware.w_id%type);
  15. END;
  16. /
  17. delimiter ;
  18. delimiter /
  19. CREATE OR REPLACE PACKAGE BODY pkg_ware_mgmt
  20. AS
  21. PROCEDURE sp_record_print_by_record(p_record IN TYPE_WARE)
  22. AS
  23. BEGIN
  24. dbms_output.put_line('Print a record :');
  25. dbms_output.put_line('W_ID : ' || p_record.w_id
  26. || ', W_YTD : ' || p_record.w_ytd
  27. || ', W_TAX : ' || p_record.w_tax
  28. || ', W_NAME : ' || p_record.w_name
  29. || ', W_STREET_1 : ' || p_record.w_street_1
  30. || ', W_CITY : ' || p_record.w_city
  31. || ', W_ZIP : ' || p_record.w_zip )
  32. ;
  33. dbms_output.put_line('');
  34. END;
  35. PROCEDURE sp_record_print(p_w_id IN ware.w_id%TYPE )
  36. IS
  37. r_ware1 TYPE_WARE;
  38. r_ware2 ware%ROWTYPE;
  39. BEGIN
  40. SELECT "W_ID","W_YTD","W_TAX","W_NAME","W_STREET_1","W_STREET_2","W_CITY","W_STATE","W_ZIP"
  41. INTO r_ware1.w_id, r_ware1.w_ytd, r_ware1.w_tax, r_ware1.w_name, r_ware1.w_street_1, r_ware1.w_street_2, r_ware1.w_city, r_ware1.w_state, r_ware1.w_zip
  42. FROM ware
  43. WHERE w_id = p_w_id;
  44. sp_record_print_by_record(r_ware1);
  45. SELECT "W_ID","W_YTD","W_TAX","W_NAME","W_STREET_1","W_STREET_2","W_CITY","W_STATE","W_ZIP"
  46. INTO r_ware2
  47. FROM ware
  48. WHERE w_id = p_w_id + 1;
  49. r_ware1 := r_ware2;
  50. sp_record_print_by_record(r_ware1);
  51. EXCEPTION
  52. WHEN OTHERS THEN
  53. dbms_output.put_line('Raise an unkown exception !');
  54. END ;
  55. END;
  56. /
  57. delimiter ;
  58. obclient> call pkg_ware_mgmt.sp_record_print(1);
  59. Query OK, 0 rows affected (0.12 sec)
  60. Print a record :
  61. W_ID : 1, W_YTD : 1200, W_TAX : .1868, W_NAME : W_NAME_1, W_STREET_1 : jTNkXKWXOdh, W_STREET_2 : lf9QXTXXGoF04IZBkCP7, W_CITY : srRq15uvxe5, W_STATE : GQ, W_ZIP : 506811111
  62. Print a record :
  63. W_ID : 2, W_YTD : 1200, W_TAX : .0862, W_NAME : W_NAME_2, W_STREET_1 : xEdT1jkENtbLwoI1Zb0, W_STREET_2 : NT0j4RCQ4OqrS, W_CITY : vlwzndw2FPrO, W_STATE : XR, W_ZIP : 063311111
  64. obclient>