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

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17013648/viewspace-1118604/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值