Here is another option with an object type that is not a PL / SQL record, but has the same behavior and more parameters to initialize with default values in the constructor (use PL / SQL expressions and functions):
Define a new type with constructor:
CREATE OR REPLACE TYPE RECORD_OPTION_ATTRIBUTES AS OBJECT( option_name VARCHAR2(200), option_value VARCHAR2(200), option_selected_ind NUMBER(1), option_class VARCHAR2(200), option_attributes VARCHAR2(200), constructor function RECORD_OPTION_ATTRIBUTES( in_option_name VARCHAR2 DEFAULT 'INVALID NAME"', in_option_value VARCHAR2 DEFAULT 'INVALID VALUE"', in_option_selected_ind NUMBER DEFAULT '0', in_option_class VARCHAR2 DEFAULT NULL, in_option_attributes VARCHAR2 DEFAULT NULL ) return self as result );
The constructor uses default values and can use complex initialization logic. Please keep in mind that you may have several constructors.
create or replace type body RECORD_OPTION_ATTRIBUTES as constructor function RECORD_OPTION_ATTRIBUTES( in_option_name VARCHAR2 DEFAULT 'INVALID NAME"', in_option_value VARCHAR2 DEFAULT 'INVALID VALUE"', in_option_selected_ind NUMBER DEFAULT '0', in_option_class VARCHAR2 DEFAULT NULL, in_option_attributes VARCHAR2 DEFAULT NULL ) return self as result as begin self.option_name := in_option_name; self.option_value := in_option_value; self.option_selected_ind := in_option_selected_ind; self.option_class := in_option_class; self.option_attributes := in_option_attributes; return; end; end; /
Let run the sql test:
select RECORD_OPTION_ATTRIBUTES(table_name, tablespace_name, ini_trans) from all_tables where owner = 'SYS' and rownum <= 10;
Check Results:
RECORD_OPTION_ATTRIBUTES(TABLE_NAME,TABLESPACE_NAME,INI_TRANS)(OPTION_NAME, OPTI -------------------------------------------------------------------------------- RECORD_OPTION_ATTRIBUTES('WRR$_REPLAY_CALL_FILTER', 'SYSAUX', 1, NULL, NULL) RECORD_OPTION_ATTRIBUTES('AW$EXPRESS', 'SYSAUX', 4, NULL, NULL) RECORD_OPTION_ATTRIBUTES('AW$AWMD', 'SYSAUX', 4, NULL, NULL) RECORD_OPTION_ATTRIBUTES('AW$AWCREATE', 'SYSAUX', 4, NULL, NULL) RECORD_OPTION_ATTRIBUTES('AW$AWCREATE10G', 'SYSAUX', 4, NULL, NULL) RECORD_OPTION_ATTRIBUTES('AW$AWXML', 'SYSAUX', 4, NULL, NULL) RECORD_OPTION_ATTRIBUTES('AW$AWREPORT', 'SYSAUX', 4, NULL, NULL) RECORD_OPTION_ATTRIBUTES('DUAL', 'SYSTEM', 1, NULL, NULL) RECORD_OPTION_ATTRIBUTES('SYSTEM_PRIVILEGE_MAP', 'SYSTEM', 1, NULL, NULL) RECORD_OPTION_ATTRIBUTES('TABLE_PRIVILEGE_MAP', 'SYSTEM', 1, NULL, NULL) 10 rows selected.
As you can see, the last 2 columns have a default value (null in this case). Compared to the original sql query in your question, all you have to do is wrap the selected columns with RECORD_OPTION_ATTRIBUTES ().