Allow DML changes on table columns

This commit is contained in:
Jan Kvetina 2022-01-30 23:04:18 +01:00
parent d4fc1cccc5
commit 7041833b43
4 changed files with 194 additions and 19 deletions

View File

@ -22,7 +22,7 @@ wwv_flow_api.create_page(
,p_page_template_options=>'#DEFAULT#'
,p_required_role=>wwv_flow_api.id(9556407311505078)
,p_last_updated_by=>'DEV'
,p_last_upd_yyyymmddhh24miss=>'20220129213714'
,p_last_upd_yyyymmddhh24miss=>'20220130212605'
);
wwv_flow_api.create_page_plug(
p_id=>wwv_flow_api.id(17065256063582738)
@ -2021,15 +2021,15 @@ wwv_flow_api.create_region_column(
,p_source_expression=>'DATA_DEFAULT'
,p_data_type=>'VARCHAR2'
,p_is_query_only=>true
,p_item_type=>'NATIVE_DISPLAY_ONLY'
,p_item_type=>'NATIVE_TEXT_FIELD'
,p_heading=>'Data Default'
,p_heading_alignment=>'LEFT'
,p_display_sequence=>70
,p_display_sequence=>80
,p_value_alignment=>'LEFT'
,p_group_id=>wwv_flow_api.id(15125109192615734)
,p_use_group_for=>'BOTH'
,p_attribute_02=>'VALUE'
,p_attribute_05=>'PLAIN'
,p_attribute_05=>'BOTH'
,p_is_required=>false
,p_enable_filter=>true
,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP'
,p_filter_is_required=>false
@ -2053,7 +2053,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_DISPLAY_ONLY'
,p_heading=>'Avg Length'
,p_heading_alignment=>'RIGHT'
,p_display_sequence=>80
,p_display_sequence=>90
,p_value_alignment=>'RIGHT'
,p_attribute_02=>'VALUE'
,p_attribute_05=>'PLAIN'
@ -2077,7 +2077,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_SINGLE_CHECKBOX'
,p_heading=>'PK'
,p_heading_alignment=>'CENTER'
,p_display_sequence=>90
,p_display_sequence=>100
,p_value_alignment=>'CENTER'
,p_group_id=>wwv_flow_api.id(15125109192615734)
,p_use_group_for=>'BOTH'
@ -2110,7 +2110,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_SINGLE_CHECKBOX'
,p_heading=>'UQ'
,p_heading_alignment=>'CENTER'
,p_display_sequence=>100
,p_display_sequence=>110
,p_value_alignment=>'CENTER'
,p_group_id=>wwv_flow_api.id(15125109192615734)
,p_use_group_for=>'BOTH'
@ -2143,7 +2143,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_SINGLE_CHECKBOX'
,p_heading=>'FK'
,p_heading_alignment=>'CENTER'
,p_display_sequence=>110
,p_display_sequence=>120
,p_value_alignment=>'CENTER'
,p_group_id=>wwv_flow_api.id(15125109192615734)
,p_use_group_for=>'BOTH'
@ -2176,7 +2176,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_SINGLE_CHECKBOX'
,p_heading=>'CH'
,p_heading_alignment=>'CENTER'
,p_display_sequence=>120
,p_display_sequence=>130
,p_value_alignment=>'CENTER'
,p_group_id=>wwv_flow_api.id(15125109192615734)
,p_use_group_for=>'BOTH'
@ -2199,6 +2199,22 @@ wwv_flow_api.create_region_column(
,p_readonly_condition_type=>'ALWAYS'
,p_readonly_for_each_row=>false
);
wwv_flow_api.create_region_column(
p_id=>wwv_flow_api.id(22085246914580620)
,p_name=>'COLUMN_NAME_OLD'
,p_source_type=>'DB_COLUMN'
,p_source_expression=>'COLUMN_NAME_OLD'
,p_data_type=>'VARCHAR2'
,p_is_query_only=>false
,p_item_type=>'NATIVE_HIDDEN'
,p_display_sequence=>60
,p_attribute_01=>'Y'
,p_use_as_row_header=>false
,p_enable_sort_group=>false
,p_is_primary_key=>true
,p_duplicate_value=>true
,p_include_in_export=>false
);
wwv_flow_api.create_region_column(
p_id=>wwv_flow_api.id(36660733495288407)
,p_name=>'COLUMN_ID'
@ -2251,7 +2267,7 @@ wwv_flow_api.create_region_column(
,p_enable_sort_group=>true
,p_enable_control_break=>true
,p_enable_hide=>true
,p_is_primary_key=>true
,p_is_primary_key=>false
,p_duplicate_value=>true
,p_include_in_export=>true
);
@ -2277,7 +2293,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_TEXT_FIELD'
,p_heading=>'Data Type'
,p_heading_alignment=>'LEFT'
,p_display_sequence=>60
,p_display_sequence=>70
,p_value_alignment=>'LEFT'
,p_group_id=>wwv_flow_api.id(15125238812615735)
,p_use_group_for=>'BOTH'
@ -2307,7 +2323,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_TEXT_FIELD'
,p_heading=>'Comments'
,p_heading_alignment=>'LEFT'
,p_display_sequence=>140
,p_display_sequence=>150
,p_value_alignment=>'LEFT'
,p_attribute_05=>'BOTH'
,p_is_required=>false
@ -2334,7 +2350,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_SINGLE_CHECKBOX'
,p_heading=>'NN'
,p_heading_alignment=>'CENTER'
,p_display_sequence=>130
,p_display_sequence=>140
,p_value_alignment=>'CENTER'
,p_group_id=>wwv_flow_api.id(15125109192615734)
,p_use_group_for=>'BOTH'
@ -2352,8 +2368,6 @@ wwv_flow_api.create_region_column(
,p_enable_hide=>true
,p_is_primary_key=>false
,p_include_in_export=>true
,p_readonly_condition_type=>'ALWAYS'
,p_readonly_for_each_row=>false
);
wwv_flow_api.create_region_column(
p_id=>wwv_flow_api.id(54275623934794479)
@ -2496,6 +2510,14 @@ wwv_flow_api.create_ig_report_column(
,p_is_frozen=>false
,p_width=>60
);
wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(22213792422816431)
,p_view_id=>wwv_flow_api.id(36859189299358778)
,p_display_seq=>13
,p_column_id=>wwv_flow_api.id(22085246914580620)
,p_is_visible=>true
,p_is_frozen=>false
);
wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(36859680329358786)
,p_view_id=>wwv_flow_api.id(36859189299358778)
@ -5929,10 +5951,19 @@ wwv_flow_api.create_page_process(
,p_process_name=>'SAVE_COLUMNS'
,p_attribute_01=>'PLSQL_CODE'
,p_attribute_04=>wwv_flow_string.join(wwv_flow_t_varchar2(
'app.log_action(''SAVE_COLUMNS'', app.get_item(''$TABLE_NAME''), :COMMENTS);',
'app_actions.save_obj_columns (',
' in_action => :APEX$ROW_STATUS,',
' in_table_name => NVL(:TABLE_NAME, :P951_TABLE_NAME),',
' in_column_id => :COLUMN_ID,',
' in_column_name => :COLUMN_NAME,',
' in_column_name_old => :COLUMN_NAME_OLD,',
' in_is_nn => :IS_NN,',
' in_data_type => :DATA_TYPE,',
' in_data_default => :DATA_DEFAULT,',
' in_comments => :COMMENTS',
');',
'--',
'EXECUTE IMMEDIATE',
' ''COMMENT ON COLUMN '' || :TABLE_NAME || ''.'' || :COLUMN_NAME || '' IS '''''' || :COMMENTS || '''''''';',
':COLUMN_NAME_OLD := :COLUMN_NAME;',
''))
,p_attribute_05=>'Y'
,p_attribute_06=>'N'

View File

@ -340,5 +340,29 @@ CREATE OR REPLACE PACKAGE app_actions AS
in_compress BOOLEAN := FALSE
);
-- ### GRID Handlers
--
--
-- Update table columns
--
PROCEDURE save_obj_columns (
in_action CHAR,
in_table_name obj_columns.table_name%TYPE,
in_column_id obj_columns.column_id%TYPE := NULL,
in_column_name obj_columns.column_name%TYPE := NULL,
in_column_name_old obj_columns.column_name_old%TYPE := NULL,
in_is_nn obj_columns.is_nn%TYPE := NULL,
in_data_type obj_columns.data_type%TYPE := NULL,
in_data_default obj_columns.data_default%TYPE := NULL,
in_comments obj_columns.comments%TYPE := NULL
);
END;
/

View File

@ -1086,5 +1086,124 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
END;
END;
PROCEDURE save_obj_columns (
in_action CHAR,
in_table_name obj_columns.table_name%TYPE,
in_column_id obj_columns.column_id%TYPE := NULL,
in_column_name obj_columns.column_name%TYPE := NULL,
in_column_name_old obj_columns.column_name_old%TYPE := NULL,
in_is_nn obj_columns.is_nn%TYPE := NULL,
in_data_type obj_columns.data_type%TYPE := NULL,
in_data_default obj_columns.data_default%TYPE := NULL,
in_comments obj_columns.comments%TYPE := NULL
) AS
rec obj_columns%ROWTYPE;
BEGIN
app.log_module_json (
'table_name', in_table_name,
'column_name', in_column_name,
'column_id', in_column_id,
'nn', in_is_nn
);
-- remove column
IF in_action = 'D' THEN
app.log_result('REMOVING COLUMN');
EXECUTE IMMEDIATE
'ALTER TABLE ' || in_table_name ||
' DROP COLUMN ' || in_column_name_old;
--
RETURN;
END IF;
-- add column
IF in_action = 'C' THEN
app.log_result('ADDING COLUMN');
EXECUTE IMMEDIATE
'ALTER TABLE ' || in_table_name ||
' ADD ' || in_column_name || ' ' || in_data_type ||
CASE WHEN in_data_default IS NOT NULL THEN ' DEFAULT ' || in_data_default END ||
CASE WHEN in_is_nn = 'Y' THEN ' NOT NULL' END;
--
EXECUTE IMMEDIATE
'COMMENT ON COLUMN ' || in_table_name || '.' || in_column_name ||
' IS ''' || in_comments || '''';
--
RETURN;
END IF;
-- check changes
FOR c IN (
SELECT
c.column_id,
c.data_type,
c.data_default,
c.is_nn,
c.comments
FROM obj_columns c
WHERE c.table_name = in_table_name
AND c.column_name = in_column_name_old
) LOOP
-- remove NOT NULL constraint
IF c.is_nn = 'Y' AND in_is_nn IS NULL THEN
app.log_result('REMOVING NOT NULL');
EXECUTE IMMEDIATE
'ALTER TABLE ' || in_table_name ||
' MODIFY ' || in_column_name_old || ' NULL';
END IF;
-- change data type (if possible)
IF c.data_type != in_data_type THEN
app.log_result('UPDATING DATA TYPE');
EXECUTE IMMEDIATE
'ALTER TABLE ' || in_table_name ||
' MODIFY ' || in_column_name_old || ' ' || in_data_type ||
CASE
WHEN in_data_default IS NOT NULL THEN ' DEFAULT ' || in_data_default
WHEN c.data_default IS NOT NULL THEN ' DEFAULT NULL'
END;
ELSIF NVL(c.data_default, '^!^') != NVL(in_data_default, '^!^') THEN
app.log_result('UPDATING DATA DEFAULT');
EXECUTE IMMEDIATE
'ALTER TABLE ' || in_table_name ||
' MODIFY ' || in_column_name_old || ' DEFAULT ' || NVL(in_data_default, 'NULL');
END IF;
-- add NOT NULL constraint
IF c.is_nn IS NULL AND in_is_nn = 'Y' THEN
app.log_result('ADDING NOT NULL');
EXECUTE IMMEDIATE
'ALTER TABLE ' || in_table_name ||
' MODIFY ' || in_column_name_old || ' NOT NULL';
END IF;
-- update column comments
IF NVL(c.comments, '^!^') != NVL(in_comments, '^!^') THEN
app.log_result('UPDATING COMMENTS');
EXECUTE IMMEDIATE
'COMMENT ON COLUMN ' || in_table_name || '.' || in_column_name_old ||
' IS ''' || in_comments || '''';
END IF;
END LOOP;
-- rename column
IF in_column_name != in_column_name_old THEN
app.log_result('RENAMING COLUMN');
EXECUTE IMMEDIATE
'ALTER TABLE ' || in_table_name ||
' RENAME COLUMN ' || in_column_name_old ||
' TO ' || in_column_name;
END IF;
--
app.log_success();
EXCEPTION
WHEN app.app_exception THEN
RAISE;
WHEN OTHERS THEN
app.raise_error();
END;
END;
/

View File

@ -55,6 +55,7 @@ SELECT
c.table_name,
c.column_id,
c.column_name,
c.column_name AS column_name_old,
c.data_type,
c.data_default,
c.avg_col_len AS avg_length,