这让我疯狂了一段时间:
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;
有人可以向我解释为什么它不起作用?有没有办法引用记录定义中声明的类型,而不是在函数中再次显式定义它?
感谢。
答案 0 :(得分:4)
您需要实际创建类型的变量以引用属性。
在你的类型声明之后和函数之前添加它。
attrib_value AttribValueRec;
然后在函数头中,您可以像这样引用函数中的属性类型:
attr attrib_value.attr%TYPE;
答案 1 :(得分:1)
看看documentation。 %TYPE和%ROWTYPE - 仅用于引用数据库列。但是你试图让用户输入参考资料。
解决方案是在数据库列上使用%TYPE-referer定义pl / sql类型,然后使用引用同一数据库列的参数创建函数。
<强>更新强>
它并非完全真实,因为主要评论员发布了有用的想法。摘要%TYPE和%ROWTYPE不仅可以引用表列。引用“真实”对象,如变量和游标也很好。