在PL / SQL中的记录字段上使用%TYPE

时间:2009-05-05 06:35:51

标签: oracle collections plsql

这让我疯狂了一段时间:

DECLARE
    TYPE AttrValueRec IS RECORD (
        attr        VARCHAR2(40),
        val         VARCHAR2(2000),
        inst        NUMBER(4)
    );

    FUNCTION create_attrval(attr   AttrValueRec.attr%TYPE,
                            val    AttrValueRec.val%TYPE,
                            inst   AttrValueRec.inst%TYPE := 1)
    RETURN AttrValueRec IS
        attr_value  AttrValueRec;
    BEGIN
        attr_value.attr := attr;
        attr_value.val := val;
        attr_value.inst := inst;
        RETURN attr_value;
    END;
BEGIN
    NULL;
END;

在记录字段上使用%TYPE似乎不起作用。它会产生以下错误:

ORA-06550: line 8, column 36:
PLS-00206: %TYPE must be applied to a variable, column, field or attribute, not to "ATTRVALUEREC.ATTR"
ORA-06550: line 8, column 5:
PL/SQL: Item ignored

虽然明确定义类型再次起作用:

DECLARE
    TYPE AttrValueRec IS RECORD (
        attr        VARCHAR2(40),
        val         VARCHAR2(2000),
        inst        NUMBER(4)
    );

    FUNCTION create_attrval(attr   VARCHAR2,
                            val    VARCHAR2,
                            inst   NUMBER := 1)
    RETURN AttrValueRec IS
        attr_value  AttrValueRec;
    BEGIN
        attr_value.attr := attr;
        attr_value.val := val;
        attr_value.inst := inst;
        RETURN attr_value;
    END;
BEGIN
    NULL;
END;

有人可以向我解释为什么它不起作用?有没有办法引用记录定义中声明的类型,而不是在函数中再次显式定义它?

感谢。

2 个答案:

答案 0 :(得分:4)

您需要实际创建类型的变量以引用属性。

在你的类型声明之后和函数之前添加它。


  attrib_value  AttribValueRec;

然后在函数头中,您可以像这样引用函数中的属性类型:


  attr  attrib_value.attr%TYPE;

答案 1 :(得分:1)

看看documentation。 %TYPE和%ROWTYPE - 仅用于引用数据库。但是你试图让用户输入参考资料。

解决方案是在数据库列上使用%TYPE-referer定义pl / sql类型,然后使用引用同一数据库列的参数创建函数。

<强>更新

它并非完全真实,因为主要评论员发布了有用的想法。摘要%TYPE和%ROWTYPE不仅可以引用表列。引用“真实”对象,如变量和游标也很好。