ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Referenc-PL/SQL集合和记录-记录变量-RECORD类型

PLSQL Language Referenc-PL/SQL集合和记录-记录变量-RECORD类型

原创 Oracle 作者: luisedalian 时间:2014-03-14 07:45:47 0 删除 编辑

RECORD类型

PL/SQL块中定义的记录类型是局部类型,只有在块内部有效。仅当这个块是个独立的存储或包子程序时,才被存储在数据库中。

在包规范中定义的记录类型是一个公有成员,可以在包外面通过包名修饰符来引用它,包名.类型名。它一直存储在数据库中,直到使用drop package语句删除了包。

不能在方案层次创建记录类型,因此记录类型不可能是ADT数据类型。

记录类型中的域,可以指定非空约束,如果指定非空约束则必须要指定一个非空的初始值。

DECLARE

TYPE DeptRecTyp IS RECORD (

    --指定非空约束和非空的默认初始值。

        dept_id    NUMBER(4) NOT NULL := 10,

        dept_name  VARCHAR2(30) NOT NULL := 'Administration',

        mgr_id     NUMBER(6) := 200,

        loc_id     NUMBER(4) := 1700

  );

 

    dept_rec DeptRecTyp;

BEGIN

    DBMS_OUTPUT.PUT_LINE('dept_id:   ' || dept_rec.dept_id);

    DBMS_OUTPUT.PUT_LINE('dept_name: ' || dept_rec.dept_name);

    DBMS_OUTPUT.PUT_LINE('mgr_id:    ' || dept_rec.mgr_id);

    DBMS_OUTPUT.PUT_LINE('loc_id:    ' || dept_rec.loc_id);

END;

 

DECLARE

    TYPE name_rec IS RECORD (

        first  employees.first_name%TYPE,

        last   employees.last_name%TYPE

    );

 

    TYPE contact IS RECORD (

        name  name_rec,                    -- 记录类型

        phone employees.phone_number%TYPE

    );

 

    friend contact;

BEGIN

    friend.name.first := 'John';

    friend.name.last := 'Smith';

    friend.phone := '1-650-555-1234';

 

    DBMS_OUTPUT.PUT_LINE (

        friend.name.first  || ' ' ||

        friend.name.last   || ', ' ||

        friend.phone

    );

END;

 

 

DECLARE

    TYPE full_name IS VARRAY(2) OF VARCHAR2(20);

 

    TYPE contact IS RECORD (

        name  full_name := full_name('John', 'Smith'),  --可变数组为记录的一个域

        phone employees.phone_number%TYPE

    );

 

    friend contact;

BEGIN

    friend.phone := '1-650-555-1234';

 

    DBMS_OUTPUT.PUT_LINE (

        friend.name(1) || ' ' ||

        friend.name(2) || ', ' ||

        friend.phone

    );

END;

 

-- 不同层次上定义的同名的记录类型互不兼容

CREATE OR REPLACE PACKAGE pkg AS

    -- 包中定义的记录类型

    TYPE rec_type IS RECORD ( 

        f1 INTEGER,

        f2 VARCHAR2(4)

    );

    PROCEDURE print_rec_type (rec rec_type);

END pkg;

 

CREATE OR REPLACE PACKAGE BODY pkg AS

    PROCEDURE print_rec_type (rec rec_type) IS

    BEGIN

        DBMS_OUTPUT.PUT_LINE(rec.f1);

        DBMS_OUTPUT.PUT_LINE(rec.f2);

    END;

END pkg;

 

DECLARE

    TYPE rec_type IS RECORD (       -- 局部记录类型

        f1 INTEGER,

        f2 VARCHAR2(4)

    );

    r1 pkg.rec_type;                -- 包中定义的记录类型

    r2     rec_type;                -- 局部记录类型

 

BEGIN

  r1.f1 := 10; r1.f2 := 'abcd';

  r2.f1 := 25; r2.f2 := 'wxyz';

 

  pkg.print_rec_type(r1);  -- 成功

  --pkg.print_rec_type(r2);  -- 失败

END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1118604/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5677795