|
18 | 18 | end if; |
19 | 19 | if to_number(v_db_version) >= 180 then |
20 | 20 | execute immediate q'[ |
21 | | - select replace(regexp_substr(version_full, '\d+\.\d+'), '.', null) as db_version |
| 21 | + select replace(regexp_substr(min(version_full), '\d+\.\d+'), '.', null) as db_version |
22 | 22 | from product_component_version |
23 | 23 | where product like 'Oracle Database%' ]' |
24 | 24 | into v_db_version; |
|
36 | 36 | prompt Compile package om_tapigen (spec) |
37 | 37 | CREATE OR REPLACE PACKAGE om_tapigen AUTHID CURRENT_USER IS |
38 | 38 | c_generator CONSTANT VARCHAR2(10 CHAR) := 'OM_TAPIGEN'; |
39 | | -c_generator_version CONSTANT VARCHAR2(10 CHAR) := '0.6.2'; |
| 39 | +c_generator_version CONSTANT VARCHAR2(10 CHAR) := '0.6.3'; |
40 | 40 | /** |
41 | 41 | Oracle PL/SQL Table API Generator |
42 | 42 | ================================= |
@@ -910,7 +910,7 @@ CREATE OR REPLACE PACKAGE BODY om_tapigen IS |
910 | 910 | WHEN p_data_type = 'BLOB' THEN |
911 | 911 | 'TO_BLOB(UTL_RAW.cast_to_raw(''@@@@@@@@@@@@@@@''))' |
912 | 912 | WHEN p_data_type = 'RAW' THEN |
913 | | - 'UTL_RAW.cast_to_raw(''@@@@@@@@@@@@@@@'')' |
| 913 | + 'UTL_RAW.cast_to_raw(''@@@@@@@@@@@@@@@'')' |
914 | 914 | WHEN p_data_type = 'XMLTYPE' THEN |
915 | 915 | 'XMLTYPE(''<NULL/>'')' |
916 | 916 | ELSE |
@@ -1097,14 +1097,14 @@ CREATE OR REPLACE PACKAGE BODY om_tapigen IS |
1097 | 1097 |
|
1098 | 1098 | -- 1. Possible substitutions: #TABLE_NAME#, #COLUMN_PREFIX# and #PK_COLUMN# (the first column on multicolumn primary keys) |
1099 | 1099 | -- 2. To be backward compatible we have to support things like this #TABLE_NAME_26# (this is like substr(table_name, 1, 26)) |
1100 | | - -- 3. If someone want to use the substr version he has always to provide position and length. |
| 1100 | + -- 3. If someone want to use the substr version - please always provide position and length. |
1101 | 1101 | -- 4. Negative position is supported like this #TABLE_NAME_-15_15# (the second number can not be omitted like in substr, see 2.) |
1102 | 1102 | IF v_position IS NULL AND v_length IS NULL THEN |
1103 | 1103 | v_position := 1; |
1104 | 1104 | v_length := 200; |
1105 | 1105 | ELSIF v_position IS NOT NULL AND v_length IS NULL THEN |
1106 | | - v_position := 1; |
1107 | 1106 | v_length := v_position; -- see point 2. above |
| 1107 | + v_position := 1; |
1108 | 1108 | END IF; |
1109 | 1109 |
|
1110 | 1110 | v_return := replace(p_name_template, |
@@ -1839,6 +1839,32 @@ CREATE OR REPLACE PACKAGE BODY om_tapigen IS |
1839 | 1839 | RETURN v_result; |
1840 | 1840 | END list_columns_w_pk_full; |
1841 | 1841 |
|
| 1842 | + ----------------------------------------------------------------------------- |
| 1843 | + /* |
| 1844 | + col1, |
| 1845 | + col2, |
| 1846 | + */ |
| 1847 | + FUNCTION list_columns_w_pk_view RETURN t_tab_list IS |
| 1848 | + v_result t_tab_list; |
| 1849 | + v_list_padding t_vc2_30; |
| 1850 | + v_index pls_integer; |
| 1851 | + BEGIN |
| 1852 | + v_list_padding := get_list_padding(6); |
| 1853 | + FOR i IN 1 .. g_columns.count LOOP |
| 1854 | + IF g_columns(i).is_hidden_yn = 'N' |
| 1855 | + AND g_columns(i).tenant_expression is null |
| 1856 | + THEN |
| 1857 | + v_index := v_result.count + 1; |
| 1858 | + v_result(v_index).col1 := v_list_padding; |
| 1859 | + v_result(v_index).col2 := |
| 1860 | + util_double_quote(g_columns(i).column_name) || |
| 1861 | + get_column_comment(i) || |
| 1862 | + c_list_delimiter; |
| 1863 | + END IF; |
| 1864 | + END LOOP; |
| 1865 | + trim_list(v_result); |
| 1866 | + RETURN v_result; |
| 1867 | + END list_columns_w_pk_view; |
1842 | 1868 |
|
1843 | 1869 | ----------------------------------------------------------------------------- |
1844 | 1870 | /* |
@@ -2625,7 +2651,10 @@ CREATE OR REPLACE PACKAGE BODY om_tapigen IS |
2625 | 2651 | v_list_padding := get_list_padding(4); |
2626 | 2652 | v_operator_padding := get_operator_padding; |
2627 | 2653 | FOR i IN 1 .. g_columns.count LOOP |
2628 | | - IF g_columns(i).data_default IS NOT NULL AND g_columns(i).is_hidden_yn = 'N' THEN |
| 2654 | + IF g_columns(i).data_default IS NOT NULL |
| 2655 | + AND g_columns(i).is_hidden_yn = 'N' |
| 2656 | + AND g_columns(i).is_virtual_yn = 'N' |
| 2657 | + THEN |
2629 | 2658 | v_index := v_result.count + 1; |
2630 | 2659 | v_result(v_index).col1 := v_list_padding || 'v_row.' || |
2631 | 2660 | util_double_quote(g_columns(i).column_name); |
@@ -2710,12 +2739,36 @@ CREATE OR REPLACE PACKAGE BODY om_tapigen IS |
2710 | 2739 |
|
2711 | 2740 | ----------------------------------------------------------------------------- |
2712 | 2741 |
|
| 2742 | + FUNCTION list_where_clause_tenant_id RETURN t_tab_list IS |
| 2743 | + v_result t_tab_list; |
| 2744 | + v_index pls_integer; |
| 2745 | + BEGIN |
| 2746 | + FOR i IN 1 .. g_columns.count LOOP |
| 2747 | + IF g_columns(i).tenant_expression IS NOT NULL THEN |
| 2748 | + v_index := v_result.count + 1; |
| 2749 | + v_result(v_index).col1 := 'WHERE '; |
| 2750 | + v_result(v_index).col2 := |
| 2751 | + util_get_attribute_compare ( |
| 2752 | + p_data_type => g_columns(i).data_type, |
| 2753 | + p_nullable => util_string_to_bool(g_columns(i).is_nullable_yn), |
| 2754 | + p_first_attribute => util_double_quote(g_columns(i).column_name), |
| 2755 | + p_second_attribute => g_columns(i).tenant_expression, |
| 2756 | + p_compare_operation => '=' ); |
| 2757 | + END IF; |
| 2758 | + END LOOP; |
| 2759 | + RETURN v_result; |
| 2760 | + END list_where_clause_tenant_id; |
| 2761 | + |
| 2762 | + ----------------------------------------------------------------------------- |
| 2763 | + |
2713 | 2764 | BEGIN |
2714 | 2765 | CASE p_list_name |
2715 | 2766 | WHEN 'LIST_INSERT_COLUMNS' THEN |
2716 | 2767 | RETURN list_insert_columns; |
2717 | 2768 | WHEN 'LIST_COLUMNS_W_PK_FULL' THEN |
2718 | 2769 | RETURN list_columns_w_pk_full; |
| 2770 | + WHEN 'LIST_COLUMNS_W_PK_VIEW' THEN |
| 2771 | + RETURN list_columns_w_pk_view; |
2719 | 2772 | WHEN 'LIST_ROWCOLS_W_DICT_DEFAULTS' THEN |
2720 | 2773 | RETURN list_rowcols_w_dict_defaults; |
2721 | 2774 | WHEN 'LIST_ROWCOLS_W_CUST_DEFAULTS' THEN |
@@ -2774,6 +2827,8 @@ CREATE OR REPLACE PACKAGE BODY om_tapigen IS |
2774 | 2827 | RETURN list_uk_map_param_eq_param; |
2775 | 2828 | WHEN 'LIST_SPEC_CUSTOM_DEFAULTS' THEN |
2776 | 2829 | RETURN list_spec_custom_defaults; |
| 2830 | + WHEN 'LIST_WHERE_CLAUSE_TENANT_ID' THEN |
| 2831 | + RETURN list_where_clause_tenant_id; |
2777 | 2832 | ELSE |
2778 | 2833 | raise_application_error(c_generator_error_number, 'FIXME: Bug - list ' || p_list_name || ' not defined'); |
2779 | 2834 | END CASE; |
@@ -3605,7 +3660,11 @@ CREATE OR REPLACE PACKAGE BODY om_tapigen IS |
3605 | 3660 | v_idx := g_columns_reverse_index(v_column_name); |
3606 | 3661 | g_columns(v_idx).audit_type := p_audit_type; |
3607 | 3662 | EXCEPTION |
3608 | | - WHEN no_data_found THEN NULL; |
| 3663 | + WHEN no_data_found THEN |
| 3664 | + raise_application_error(c_generator_error_number, |
| 3665 | + 'Invalid column name ' || v_column_name || c_lf || |
| 3666 | + 'provided for the parameter p_audit_column_mappings' || c_lf || |
| 3667 | + 'and audit type ' || p_audit_type ); |
3609 | 3668 | WHEN others THEN raise; |
3610 | 3669 | END; |
3611 | 3670 | END IF; |
@@ -3661,15 +3720,13 @@ CREATE OR REPLACE PACKAGE BODY om_tapigen IS |
3661 | 3720 | v_idx := g_columns_reverse_index(v_column_name); |
3662 | 3721 | g_columns(v_idx).row_version_expression := v_expression; |
3663 | 3722 | EXCEPTION |
3664 | | - WHEN no_data_found THEN NULL; |
| 3723 | + WHEN no_data_found THEN |
| 3724 | + raise_application_error(c_generator_error_number, |
| 3725 | + 'Invalid column name ' || v_column_name || c_lf || |
| 3726 | + 'provided for the parameter p_row_version_column_mapping.' || c_lf || |
| 3727 | + 'Example Usage: #PREFIX#_MY_COLUMN_NAME=my_version_sequence.nextval'); |
3665 | 3728 | WHEN others THEN raise; |
3666 | 3729 | END; |
3667 | | - IF v_idx IS NULL THEN |
3668 | | - raise_application_error(c_generator_error_number, |
3669 | | - 'Invalid column name provided in the parameter' || c_lf || |
3670 | | - 'p_row_version_column_mapping.' || c_lf || |
3671 | | - 'Example Usage: #PREFIX#_MY_COLUMN_NAME=my_version_sequence.nextval'); |
3672 | | - END IF; |
3673 | 3730 | util_debug_stop_one_step; |
3674 | 3731 | END IF; |
3675 | 3732 | END IF; |
@@ -3707,15 +3764,13 @@ CREATE OR REPLACE PACKAGE BODY om_tapigen IS |
3707 | 3764 | v_idx := g_columns_reverse_index(v_column_name); |
3708 | 3765 | g_columns(v_idx).tenant_expression := v_expression; |
3709 | 3766 | EXCEPTION |
3710 | | - WHEN no_data_found THEN NULL; |
| 3767 | + WHEN no_data_found THEN |
| 3768 | + raise_application_error(c_generator_error_number, |
| 3769 | + 'Invalid column name ' || v_column_name || c_lf || |
| 3770 | + 'provided for the parameter p_tenant_column_mapping.' || c_lf || |
| 3771 | + q'[Example Usage: #PREFIX#_MY_COLUMN_NAME=to_number(sys_context('my_sec_ctx','my_tenant_id'))]'); |
3711 | 3772 | WHEN others THEN raise; |
3712 | 3773 | END; |
3713 | | - IF v_idx IS NULL THEN |
3714 | | - raise_application_error(c_generator_error_number, |
3715 | | - 'Invalid column name provided in the parameter' || c_lf || |
3716 | | - 'p_tenant_column_mapping.' || c_lf || |
3717 | | - q'[Example Usage: #PREFIX#_MY_COLUMN_NAME=to_number(sys_context('my_sec_ctx','my_tenant_id'))]'); |
3718 | | - END IF; |
3719 | 3774 | util_debug_stop_one_step; |
3720 | 3775 | END IF; |
3721 | 3776 | END IF; |
@@ -5169,8 +5224,9 @@ END {{ API_NAME }};'; |
5169 | 5224 |
|
5170 | 5225 | g_code_blocks.template := ' |
5171 | 5226 | CREATE OR REPLACE VIEW {{ OWNER }}.{{ DML_VIEW_NAME }} AS |
5172 | | -SELECT {% LIST_COLUMNS_W_PK_FULL %} |
| 5227 | +SELECT {% LIST_COLUMNS_W_PK_VIEW %} |
5173 | 5228 | FROM {{ TABLE_NAME }} |
| 5229 | + {% LIST_WHERE_CLAUSE_TENANT_ID %} |
5174 | 5230 | /* |
5175 | 5231 | This is the DML view for the table {{ TABLE_NAME }}. |
5176 | 5232 | - Generator: {{ GENERATOR }} |
@@ -5238,8 +5294,9 @@ END {{ DML_VIEW_TRIGGER_NAME }};'; |
5238 | 5294 |
|
5239 | 5295 | g_code_blocks.template := ' |
5240 | 5296 | CREATE OR REPLACE VIEW {{ OWNER }}.{{ ONE_TO_ONE_VIEW_NAME }} AS |
5241 | | -SELECT {% LIST_COLUMNS_W_PK_FULL %} |
| 5297 | +SELECT {% LIST_COLUMNS_W_PK_VIEW %} |
5242 | 5298 | FROM {{ TABLE_NAME }} |
| 5299 | + {% LIST_WHERE_CLAUSE_TENANT_ID %} |
5243 | 5300 | WITH READ ONLY |
5244 | 5301 | /* |
5245 | 5302 | This is the 1:1 view for the table {{ TABLE_NAME }}. |
|
0 commit comments