【发布时间】:2016-10-27 15:17:43
【问题描述】:
TL;博士:
如何声明用户定义的记录类型,以便如果我不填充其中一个字段,该字段将使用其DEFAULT?
详情:
在我的包规范中,我定义了以下记录和表类型:
/* set up a custom datatypes that will allow us to pass an array of values into CCD_UI procedures and functions */
TYPE RECORD_OPTION_ATTRIBUTES IS RECORD(
option_name VARCHAR2(200) NOT NULL DEFAULT 'INVALID NAME"', /* default intentionally breaks HTML */
option_value VARCHAR2(200) NOT NULL DEFAULT 'INVALID VALUE"', /* default intentionally breaks HTML */
option_selected_ind NUMBER(1) NOT NULL DEFAULT '0',
option_class VARCHAR2(200) DEFAULT NULL,
option_attributes VARCHAR2(200) DEFAULT NULL
);
TYPE TABLE_OPTION_ATTRIBUTES IS TABLE OF RECORD_OPTION_ATTRIBUTES
INDEX BY BINARY_INTEGER;
在包体中,我的功能与此非常相似:
PROCEDURE populate_user_defined_table()
AS
v_criteria_pairs TABLE_OPTION_ATTRIBUTES;
BEGIN
SELECT some_column1 AS option_name, some_column2 AS option_value, some_column3 AS selected_ind,
some_column4 AS option_class
BULK COLLECT INTO v_criteria_pairs
FROM Some_Table
WHERE some_column='whatever';
END;
敏锐的眼睛会注意到我没有在option_attributes 字段中插入任何值;我只填充了 5 个可用字段中的 4 个。
当我尝试编译这个包时,我从包体中收到以下错误:
PL/SQL:ORA-00913:值太多
如果我从 RECORD_OPTION_ATTRIBUTES 声明中删除 option_attributes 字段,包将编译。
如何声明记录类型,以便如果我不为 option_attributes 指定值,该字段将默认为 NULL?
【问题讨论】:
-
为什么你不能在你的选择列表中放一个NULL?它不会增加任何实际开销,并且会满足拥有匹配字段列表的需求。
-
@HepC:特别是,我在一个已经被广泛使用的包中添加了
option_attributes;我需要此更改向后兼容(并且不需要对引用TABLE_OPTION_ATTRIBUTES的所有其他包进行编辑)。*通常*,使用默认值更方便。 -
那是可以理解的。但是,我不相信有一种方法可以批量收集简单的记录类型,而不会在选择中的列数和类型中的字段数完全相同。您可能需要声明一个新的记录类型,而不是使用现有的。
-
我认为你应该接受打击并重构你现有的包。
-
根据记录类型创建新记录是完全可以接受的,它将具有默认值。只是用select-statement填充记录类型时不能省略列。
标签: oracle plsql oracle11g user-defined-types mod-plsql