Search Packages by name, module, arg, source code...

This commit is contained in:
Jan Kvetina 2022-01-27 19:48:19 +01:00
parent 78fe7ab16d
commit c3766de321
3 changed files with 390 additions and 95 deletions

View File

@ -24,14 +24,26 @@ wwv_flow_api.create_page(
,p_last_updated_by=>'DEV' ,p_last_updated_by=>'DEV'
,p_last_upd_yyyymmddhh24miss=>'20220121205716' ,p_last_upd_yyyymmddhh24miss=>'20220121205716'
); );
wwv_flow_api.create_page_plug(
p_id=>wwv_flow_api.id(21452402618924104)
,p_plug_name=>'PACKAGES'
,p_region_template_options=>'#DEFAULT#'
,p_plug_template=>wwv_flow_api.id(9049155795569902)
,p_plug_display_sequence=>10
,p_include_in_reg_disp_sel_yn=>'Y'
,p_plug_display_point=>'BODY'
,p_plug_query_options=>'DERIVED_REPORT_COLUMNS'
,p_attribute_01=>'N'
,p_attribute_02=>'HTML'
);
wwv_flow_api.create_page_plug( wwv_flow_api.create_page_plug(
p_id=>wwv_flow_api.id(14931272082872321) p_id=>wwv_flow_api.id(14931272082872321)
,p_plug_name=>'Packages' ,p_plug_name=>'Packages'
,p_parent_plug_id=>wwv_flow_api.id(21452402618924104)
,p_icon_css_classes=>'fa-table-pointer' ,p_icon_css_classes=>'fa-table-pointer'
,p_region_template_options=>'#DEFAULT#' ,p_region_template_options=>'#DEFAULT#'
,p_plug_template=>wwv_flow_api.id(9070356145569920) ,p_plug_template=>wwv_flow_api.id(9070356145569920)
,p_plug_display_sequence=>10 ,p_plug_display_sequence=>30
,p_include_in_reg_disp_sel_yn=>'Y'
,p_plug_display_point=>'BODY' ,p_plug_display_point=>'BODY'
,p_plug_query_options=>'DERIVED_REPORT_COLUMNS' ,p_plug_query_options=>'DERIVED_REPORT_COLUMNS'
,p_attribute_01=>'N' ,p_attribute_01=>'N'
@ -41,10 +53,10 @@ wwv_flow_api.create_page_plug(
p_id=>wwv_flow_api.id(14931328612872322) p_id=>wwv_flow_api.id(14931328612872322)
,p_plug_name=>'Packages [GRID]' ,p_plug_name=>'Packages [GRID]'
,p_region_name=>'PACKAGES' ,p_region_name=>'PACKAGES'
,p_parent_plug_id=>wwv_flow_api.id(21452402618924104)
,p_region_template_options=>'#DEFAULT#' ,p_region_template_options=>'#DEFAULT#'
,p_plug_template=>wwv_flow_api.id(9078290074569925) ,p_plug_template=>wwv_flow_api.id(9078290074569925)
,p_plug_display_sequence=>20 ,p_plug_display_sequence=>40
,p_include_in_reg_disp_sel_yn=>'Y'
,p_plug_display_point=>'BODY' ,p_plug_display_point=>'BODY'
,p_query_type=>'TABLE' ,p_query_type=>'TABLE'
,p_query_table=>'OBJ_PACKAGES' ,p_query_table=>'OBJ_PACKAGES'
@ -361,17 +373,29 @@ wwv_flow_api.create_ig_report_column(
,p_is_frozen=>false ,p_is_frozen=>false
); );
wwv_flow_api.create_page_plug( wwv_flow_api.create_page_plug(
p_id=>wwv_flow_api.id(14931458804872323) p_id=>wwv_flow_api.id(21452599953924105)
,p_plug_name=>'Package Modules' ,p_plug_name=>'MODULES'
,p_icon_css_classes=>'fa-table-search'
,p_region_template_options=>'#DEFAULT#' ,p_region_template_options=>'#DEFAULT#'
,p_plug_template=>wwv_flow_api.id(9070356145569920) ,p_plug_template=>wwv_flow_api.id(9049155795569902)
,p_plug_display_sequence=>30 ,p_plug_display_sequence=>20
,p_include_in_reg_disp_sel_yn=>'Y' ,p_include_in_reg_disp_sel_yn=>'Y'
,p_plug_display_point=>'BODY' ,p_plug_display_point=>'BODY'
,p_plug_query_options=>'DERIVED_REPORT_COLUMNS' ,p_plug_query_options=>'DERIVED_REPORT_COLUMNS'
,p_plug_display_condition_type=>'ITEM_IS_NOT_NULL' ,p_plug_display_condition_type=>'ITEM_IS_NOT_NULL'
,p_plug_display_when_condition=>'P960_PACKAGE_NAME' ,p_plug_display_when_condition=>'P960_SHOW_MODULES'
,p_attribute_01=>'N'
,p_attribute_02=>'HTML'
);
wwv_flow_api.create_page_plug(
p_id=>wwv_flow_api.id(14931458804872323)
,p_plug_name=>'Package Modules'
,p_parent_plug_id=>wwv_flow_api.id(21452599953924105)
,p_icon_css_classes=>'fa-table-search'
,p_region_template_options=>'#DEFAULT#'
,p_plug_template=>wwv_flow_api.id(9070356145569920)
,p_plug_display_sequence=>40
,p_plug_display_point=>'BODY'
,p_plug_query_options=>'DERIVED_REPORT_COLUMNS'
,p_attribute_01=>'N' ,p_attribute_01=>'N'
,p_attribute_02=>'HTML' ,p_attribute_02=>'HTML'
); );
@ -379,11 +403,11 @@ wwv_flow_api.create_page_plug(
p_id=>wwv_flow_api.id(14931574823872324) p_id=>wwv_flow_api.id(14931574823872324)
,p_plug_name=>'Package Modules [GRID]' ,p_plug_name=>'Package Modules [GRID]'
,p_region_name=>'MODULES' ,p_region_name=>'MODULES'
,p_parent_plug_id=>wwv_flow_api.id(21452599953924105)
,p_region_template_options=>'#DEFAULT#' ,p_region_template_options=>'#DEFAULT#'
,p_component_template_options=>'#DEFAULT#' ,p_component_template_options=>'#DEFAULT#'
,p_plug_template=>wwv_flow_api.id(9078290074569925) ,p_plug_template=>wwv_flow_api.id(9078290074569925)
,p_plug_display_sequence=>40 ,p_plug_display_sequence=>50
,p_include_in_reg_disp_sel_yn=>'Y'
,p_plug_display_point=>'BODY' ,p_plug_display_point=>'BODY'
,p_query_type=>'TABLE' ,p_query_type=>'TABLE'
,p_query_table=>'OBJ_MODULES' ,p_query_table=>'OBJ_MODULES'
@ -393,8 +417,6 @@ wwv_flow_api.create_page_plug(
,p_include_rowid_column=>false ,p_include_rowid_column=>false
,p_plug_source_type=>'NATIVE_IG' ,p_plug_source_type=>'NATIVE_IG'
,p_plug_query_options=>'DERIVED_REPORT_COLUMNS' ,p_plug_query_options=>'DERIVED_REPORT_COLUMNS'
,p_plug_display_condition_type=>'ITEM_IS_NOT_NULL'
,p_plug_display_when_condition=>'P960_PACKAGE_NAME'
,p_prn_content_disposition=>'ATTACHMENT' ,p_prn_content_disposition=>'ATTACHMENT'
,p_prn_document_header=>'APEX' ,p_prn_document_header=>'APEX'
,p_prn_units=>'MILLIMETERS' ,p_prn_units=>'MILLIMETERS'
@ -1005,12 +1027,16 @@ wwv_flow_api.create_ig_report_view(
wwv_flow_api.create_ig_report_column( wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(15054580481502742) p_id=>wwv_flow_api.id(15054580481502742)
,p_view_id=>wwv_flow_api.id(15054065173502740) ,p_view_id=>wwv_flow_api.id(15054065173502740)
,p_display_seq=>1 ,p_display_seq=>2
,p_column_id=>wwv_flow_api.id(14931760880872326) ,p_column_id=>wwv_flow_api.id(14931760880872326)
,p_is_visible=>false ,p_is_visible=>false
,p_is_frozen=>false ,p_is_frozen=>false
,p_width=>200 ,p_width=>200
,p_sort_order=>1 ,p_sort_order=>1
,p_break_order=>2.5
,p_break_is_enabled=>true
,p_break_sort_direction=>'ASC'
,p_break_sort_nulls=>'LAST'
,p_sort_direction=>'ASC' ,p_sort_direction=>'ASC'
,p_sort_nulls=>'LAST' ,p_sort_nulls=>'LAST'
); );
@ -1089,6 +1115,18 @@ wwv_flow_api.create_ig_report_column(
,p_is_frozen=>false ,p_is_frozen=>false
,p_width=>80 ,p_width=>80
); );
wwv_flow_api.component_end;
end;
/
begin
wwv_flow_api.component_begin (
p_version_yyyy_mm_dd=>'2021.04.15'
,p_release=>'21.1.7'
,p_default_workspace_id=>9014660246496943
,p_default_application_id=>770
,p_default_id_offset=>0
,p_default_owner=>'CORE'
);
wwv_flow_api.create_ig_report_column( wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(15063524211502764) p_id=>wwv_flow_api.id(15063524211502764)
,p_view_id=>wwv_flow_api.id(15054065173502740) ,p_view_id=>wwv_flow_api.id(15054065173502740)
@ -1116,18 +1154,6 @@ wwv_flow_api.create_ig_report_column(
,p_is_frozen=>false ,p_is_frozen=>false
,p_width=>70 ,p_width=>70
); );
wwv_flow_api.component_end;
end;
/
begin
wwv_flow_api.component_begin (
p_version_yyyy_mm_dd=>'2021.04.15'
,p_release=>'21.1.7'
,p_default_workspace_id=>9014660246496943
,p_default_application_id=>770
,p_default_id_offset=>0
,p_default_owner=>'CORE'
);
wwv_flow_api.create_ig_report_column( wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(15066272572502771) p_id=>wwv_flow_api.id(15066272572502771)
,p_view_id=>wwv_flow_api.id(15054065173502740) ,p_view_id=>wwv_flow_api.id(15054065173502740)
@ -1184,6 +1210,21 @@ wwv_flow_api.create_ig_report_column(
,p_is_frozen=>false ,p_is_frozen=>false
,p_width=>80 ,p_width=>80
); );
wwv_flow_api.create_page_button(
p_id=>wwv_flow_api.id(20858676684868443)
,p_button_sequence=>90
,p_button_plug_id=>wwv_flow_api.id(14931272082872321)
,p_button_name=>'SEARCH'
,p_button_action=>'SUBMIT'
,p_button_template_options=>'#DEFAULT#'
,p_button_template_id=>wwv_flow_api.id(9145249029569999)
,p_button_is_hot=>'Y'
,p_button_image_alt=>'Search'
,p_button_position=>'BODY'
,p_button_css_classes=>'SEARCH_FIELDS'
,p_grid_new_row=>'N'
,p_grid_new_column=>'Y'
);
wwv_flow_api.create_page_button( wwv_flow_api.create_page_button(
p_id=>wwv_flow_api.id(15123829307615721) p_id=>wwv_flow_api.id(15123829307615721)
,p_button_sequence=>10 ,p_button_sequence=>10
@ -1197,6 +1238,38 @@ wwv_flow_api.create_page_button(
,p_button_redirect_url=>'f?p=&APP_ID.:960:&SESSION.::&DEBUG.:960::' ,p_button_redirect_url=>'f?p=&APP_ID.:960:&SESSION.::&DEBUG.:960::'
,p_icon_css_classes=>'fa-refresh' ,p_icon_css_classes=>'fa-refresh'
); );
wwv_flow_api.create_page_button(
p_id=>wwv_flow_api.id(20858880066868445)
,p_button_sequence=>20
,p_button_plug_id=>wwv_flow_api.id(14931272082872321)
,p_button_name=>'SHOW_SEARCH'
,p_button_static_id=>'BUTTON_SHOW_SEARCH'
,p_button_action=>'DEFINED_BY_DA'
,p_button_template_options=>'#DEFAULT#'
,p_button_template_id=>wwv_flow_api.id(9144574670569995)
,p_button_image_alt=>'Search'
,p_button_position=>'RIGHT_OF_TITLE'
,p_button_execute_validations=>'N'
,p_warn_on_unsaved_changes=>null
,p_icon_css_classes=>'fa-search'
,p_button_cattributes=>'style="margin-right: 0;"'
);
wwv_flow_api.create_page_button(
p_id=>wwv_flow_api.id(20859170627868448)
,p_button_sequence=>30
,p_button_plug_id=>wwv_flow_api.id(14931272082872321)
,p_button_name=>'CLOSE_SEARCH'
,p_button_static_id=>'BUTTON_CLOSE_SEARCH'
,p_button_action=>'DEFINED_BY_DA'
,p_button_template_options=>'#DEFAULT#'
,p_button_template_id=>wwv_flow_api.id(9144574670569995)
,p_button_image_alt=>'Close Search'
,p_button_position=>'RIGHT_OF_TITLE'
,p_button_execute_validations=>'N'
,p_warn_on_unsaved_changes=>null
,p_icon_css_classes=>'fa-times'
,p_button_cattributes=>'style="margin-right: 0; display: none;"'
);
wwv_flow_api.create_page_item( wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(15123714972615720) p_id=>wwv_flow_api.id(15123714972615720)
,p_name=>'P960_PACKAGE_NAME' ,p_name=>'P960_PACKAGE_NAME'
@ -1213,6 +1286,184 @@ wwv_flow_api.create_page_item(
,p_display_as=>'NATIVE_HIDDEN' ,p_display_as=>'NATIVE_HIDDEN'
,p_attribute_01=>'Y' ,p_attribute_01=>'Y'
); );
wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(20858494816868441)
,p_name=>'P960_SEARCH_PACKAGES'
,p_item_sequence=>50
,p_item_plug_id=>wwv_flow_api.id(14931272082872321)
,p_prompt=>'Package Like'
,p_display_as=>'NATIVE_TEXT_FIELD'
,p_cSize=>30
,p_grid_row_css_classes=>'HIDDEN'
,p_colspan=>2
,p_field_template=>wwv_flow_api.id(9142775823569991)
,p_item_css_classes=>'SEARCH_FIELDS'
,p_item_template_options=>'#DEFAULT#'
,p_attribute_01=>'Y'
,p_attribute_02=>'N'
,p_attribute_04=>'TEXT'
,p_attribute_05=>'BOTH'
);
wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(20858592092868442)
,p_name=>'P960_SEARCH_SOURCE'
,p_item_sequence=>80
,p_item_plug_id=>wwv_flow_api.id(14931272082872321)
,p_prompt=>'Source Contains'
,p_display_as=>'NATIVE_TEXT_FIELD'
,p_cSize=>30
,p_begin_on_new_line=>'N'
,p_colspan=>3
,p_field_template=>wwv_flow_api.id(9142775823569991)
,p_item_css_classes=>'SEARCH_FIELDS'
,p_item_template_options=>'#DEFAULT#'
,p_attribute_01=>'Y'
,p_attribute_02=>'N'
,p_attribute_04=>'TEXT'
,p_attribute_05=>'BOTH'
);
wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(20858798281868444)
,p_name=>'P960_SEARCH_ARGUMENTS'
,p_item_sequence=>70
,p_item_plug_id=>wwv_flow_api.id(14931272082872321)
,p_prompt=>'Argument Like'
,p_display_as=>'NATIVE_TEXT_FIELD'
,p_cSize=>30
,p_begin_on_new_line=>'N'
,p_colspan=>2
,p_field_template=>wwv_flow_api.id(9142775823569991)
,p_item_css_classes=>'SEARCH_FIELDS'
,p_item_template_options=>'#DEFAULT#'
,p_attribute_01=>'Y'
,p_attribute_02=>'N'
,p_attribute_04=>'TEXT'
,p_attribute_05=>'BOTH'
);
wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(21452396894924103)
,p_name=>'P960_SEARCH_MODULES'
,p_item_sequence=>60
,p_item_plug_id=>wwv_flow_api.id(14931272082872321)
,p_prompt=>'Module Like'
,p_display_as=>'NATIVE_TEXT_FIELD'
,p_cSize=>30
,p_begin_on_new_line=>'N'
,p_colspan=>2
,p_field_template=>wwv_flow_api.id(9142775823569991)
,p_item_css_classes=>'SEARCH_FIELDS'
,p_item_template_options=>'#DEFAULT#'
,p_attribute_01=>'Y'
,p_attribute_02=>'N'
,p_attribute_04=>'TEXT'
,p_attribute_05=>'BOTH'
);
wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(21452605699924106)
,p_name=>'P960_SHOW_MODULES'
,p_item_sequence=>40
,p_item_plug_id=>wwv_flow_api.id(14931272082872321)
,p_display_as=>'NATIVE_HIDDEN'
,p_attribute_01=>'Y'
);
wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(21452740453924107)
,p_name=>'P960_SHOW_SEARCH'
,p_item_sequence=>30
,p_item_plug_id=>wwv_flow_api.id(14931272082872321)
,p_display_as=>'NATIVE_HIDDEN'
,p_attribute_01=>'Y'
);
wwv_flow_api.create_page_da_event(
p_id=>wwv_flow_api.id(20859208251868449)
,p_name=>'CLOSE_SEARCH'
,p_event_sequence=>10
,p_triggering_element_type=>'BUTTON'
,p_triggering_button_id=>wwv_flow_api.id(20859170627868448)
,p_bind_type=>'bind'
,p_bind_event_type=>'click'
);
wwv_flow_api.create_page_da_action(
p_id=>wwv_flow_api.id(21456727751924147)
,p_event_id=>wwv_flow_api.id(20859208251868449)
,p_event_result=>'TRUE'
,p_action_sequence=>10
,p_execute_on_page_init=>'N'
,p_action=>'NATIVE_JAVASCRIPT_CODE'
,p_attribute_01=>wwv_flow_string.join(wwv_flow_t_varchar2(
'$(''.SEARCH_FIELDS'').hide();',
'$(''#BUTTON_CLOSE_SEARCH'').hide();',
'$(''#BUTTON_SHOW_SEARCH'').show().focus();',
''))
);
wwv_flow_api.create_page_da_event(
p_id=>wwv_flow_api.id(21452157309924101)
,p_name=>'SHOW_SEARCH'
,p_event_sequence=>20
,p_triggering_element_type=>'BUTTON'
,p_triggering_button_id=>wwv_flow_api.id(20858880066868445)
,p_bind_type=>'bind'
,p_bind_event_type=>'click'
);
wwv_flow_api.create_page_da_action(
p_id=>wwv_flow_api.id(21456604758924146)
,p_event_id=>wwv_flow_api.id(21452157309924101)
,p_event_result=>'TRUE'
,p_action_sequence=>10
,p_execute_on_page_init=>'N'
,p_action=>'NATIVE_JAVASCRIPT_CODE'
,p_attribute_01=>wwv_flow_string.join(wwv_flow_t_varchar2(
'$(''.t-HeroRegion-col.t-HeroRegion-col--content .HIDDEN'').removeClass(''HIDDEN'');',
'//',
'$(''.SEARCH_FIELDS'').show();',
'$(''#BUTTON_SHOW_SEARCH'').hide();',
'$(''#BUTTON_CLOSE_SEARCH'').show().focus();',
''))
);
wwv_flow_api.create_page_da_action(
p_id=>wwv_flow_api.id(21456866742924148)
,p_event_id=>wwv_flow_api.id(21452157309924101)
,p_event_result=>'TRUE'
,p_action_sequence=>20
,p_execute_on_page_init=>'Y'
,p_action=>'NATIVE_JAVASCRIPT_CODE'
,p_attribute_01=>wwv_flow_string.join(wwv_flow_t_varchar2(
'$(''.t-HeroRegion-col.t-HeroRegion-col--content .HIDDEN'').removeClass(''HIDDEN'');',
'//',
'$(''.SEARCH_FIELDS'').show();',
'$(''#BUTTON_SHOW_SEARCH'').hide();',
'$(''#BUTTON_CLOSE_SEARCH'').show().focus();',
''))
,p_server_condition_type=>'ITEM_IS_NOT_NULL'
,p_server_condition_expr1=>'P960_SHOW_SEARCH'
);
wwv_flow_api.create_page_process(
p_id=>wwv_flow_api.id(21452841275924108)
,p_process_sequence=>10
,p_process_point=>'BEFORE_HEADER'
,p_process_type=>'NATIVE_PLSQL'
,p_process_name=>'INIT_DEFAULTS'
,p_process_sql_clob=>wwv_flow_string.join(wwv_flow_t_varchar2(
':P960_SHOW_SEARCH := NULL;',
':P960_SHOW_MODULES := NULL;',
'--',
'IF (:P960_SEARCH_PACKAGES IS NOT NULL',
' OR :P960_SEARCH_MODULES IS NOT NULL',
' OR :P960_SEARCH_ARGUMENTS IS NOT NULL',
' OR :P960_SEARCH_SOURCE IS NOT NULL',
') THEN',
' :P960_PACKAGE_NAME := NULL;',
' :P960_SHOW_SEARCH := ''Y'';',
' :P960_SHOW_MODULES := ''Y'';',
'END IF;',
'--',
'IF :P960_PACKAGE_NAME IS NOT NULL THEN',
' :P960_SHOW_MODULES := ''Y'';',
'END IF;',
''))
,p_process_clob_language=>'PLSQL'
,p_error_display_location=>'INLINE_IN_NOTIFICATION'
);
wwv_flow_api.component_end; wwv_flow_api.component_end;
end; end;
/ /

View File

@ -1,8 +1,13 @@
CREATE OR REPLACE VIEW obj_modules AS CREATE OR REPLACE VIEW obj_modules AS
WITH x AS ( WITH x AS (
SELECT /*+ MATERIALIZE */ SELECT /*+ MATERIALIZE */
app.get_item('$PACKAGE_NAME') AS package_name, app.get_item('$PACKAGE_NAME') AS package_name,
app.get_item('$MODULE_TYPE') AS module_type app.get_item('$MODULE_TYPE') AS module_type,
--
UPPER(app.get_item('$SEARCH_PACKAGES')) AS search_packages,
UPPER(app.get_item('$SEARCH_MODULES')) AS search_modules,
UPPER(app.get_item('$SEARCH_ARGUMENTS')) AS search_arguments,
LOWER(app.get_item('$SEARCH_SOURCE')) AS search_source
FROM DUAL FROM DUAL
), ),
p AS ( p AS (
@ -29,16 +34,27 @@ p AS (
AND NVL(p.overload, 1) = 1 AND NVL(p.overload, 1) = 1
JOIN x JOIN x
ON s.name = NVL(x.package_name, s.name) ON s.name = NVL(x.package_name, s.name)
AND (p.object_name LIKE x.search_packages || '%' ESCAPE '\' OR x.search_packages IS NULL)
WHERE i.type IN ('PROCEDURE', 'FUNCTION') WHERE i.type IN ('PROCEDURE', 'FUNCTION')
AND i.object_type IN ('PACKAGE', 'PACKAGE BODY') AND i.object_type IN ('PACKAGE', 'PACKAGE BODY')
AND i.usage = CASE s.type WHEN 'PACKAGE BODY' THEN 'DEFINITION' ELSE 'DECLARATION' END AND i.usage = CASE s.type WHEN 'PACKAGE BODY' THEN 'DEFINITION' ELSE 'DECLARATION' END
), ),
e AS ( s AS (
-- find ending lines SELECT
SELECT s.* s.name,
s.type,
s.line,
s.text,
CASE WHEN LOWER(s.text) LIKE '%' || x.search_source || '%' ESCAPE '\' THEN 'Y' END AS is_found_text
FROM user_source s FROM user_source s
JOIN x JOIN x
ON s.name = NVL(x.package_name, s.name) ON s.name = NVL(x.package_name, s.name)
AND (s.name LIKE x.search_packages || '%' ESCAPE '\' OR x.search_packages IS NULL)
),
e AS (
-- find ending lines
SELECT s.name, s.type, s.line
FROM s
WHERE ( WHERE (
(s.type = 'PACKAGE BODY' AND REGEXP_LIKE(UPPER(s.text), '^\s*END(\s+[A-Z0-9_]+)?\s*;')) OR (s.type = 'PACKAGE BODY' AND REGEXP_LIKE(UPPER(s.text), '^\s*END(\s+[A-Z0-9_]+)?\s*;')) OR
(s.type = 'PACKAGE' AND REGEXP_LIKE(UPPER(s.text), ';')) (s.type = 'PACKAGE' AND REGEXP_LIKE(UPPER(s.text), ';'))
@ -70,44 +86,50 @@ t AS (
a AS ( a AS (
-- arguments -- arguments
SELECT SELECT
a.package_name, t.package_name,
a.object_name AS module_name, t.module_name,
MIN(CASE WHEN a.in_out = 'OUT' AND a.position = 0 THEN 'FUNCTION' ELSE 'PROCEDURE' END) AS module_type, t.module_type,
a.overload, t.overload,
NULLIF(SUM(CASE WHEN a.in_out LIKE 'IN%' THEN 1 ELSE 0 END), 0) AS args_in, --
NULLIF(SUM(CASE WHEN a.in_out LIKE '%OUT' AND position > 0 THEN 1 ELSE 0 END), 0) AS args_out NULLIF(SUM(CASE WHEN a.in_out LIKE 'IN%' THEN 1 ELSE 0 END), 0) AS args_in,
FROM user_arguments a NULLIF(SUM(CASE WHEN a.in_out LIKE '%OUT' AND position > 0 THEN 1 ELSE 0 END), 0) AS args_out,
JOIN x MAX(CASE WHEN (a.argument_name LIKE x.search_arguments || '%' ESCAPE '\') THEN 'Y' END) AS is_arg_present
ON a.package_name = NVL(x.package_name, a.package_name) FROM t
GROUP BY a.package_name, a.object_name, a.overload CROSS JOIN x
LEFT JOIN user_arguments a
ON a.package_name = t.package_name
AND a.object_name = t.module_name
AND NVL(a.overload, 0) = NVL(t.overload, 0)
GROUP BY t.package_name, t.module_name, t.module_type, t.overload
), ),
d AS ( d AS (
-- documentation lines -- documentation lines
SELECT SELECT
d.package_name, d.module_name, d.module_type, d.overload, --x.line, x.text d.package_name, d.module_name, d.module_type, d.overload, --s.line, s.text
LISTAGG(REGEXP_SUBSTR(x.text, '^\s*--\s*(.*)\s*$', 1, 1, NULL, 1), '<br />') WITHIN GROUP (ORDER BY x.line) AS comment_, LISTAGG(REGEXP_SUBSTR(s.text, '^\s*--\s*(.*)\s*$', 1, 1, NULL, 1), '<br />') WITHIN GROUP (ORDER BY s.line) AS comment_,
MIN(x.line) AS doc_start MIN(s.line) AS doc_start
FROM ( FROM (
SELECT SELECT
t.package_name, t.module_name, t.module_type, t.overload, t.package_name, t.module_name, t.module_type, t.overload,
MAX(x.line) + 1 AS doc_start, MAX(s.line) + 1 AS doc_start,
t.spec_start - 1 AS doc_end t.spec_start - 1 AS doc_end
FROM t FROM t
LEFT JOIN user_source x LEFT JOIN s
ON x.name = t.package_name ON s.name = t.package_name
AND x.type = 'PACKAGE' AND s.type = 'PACKAGE'
AND x.line < t.spec_start AND s.line < t.spec_start
AND REGEXP_LIKE(x.text, '^\s*$') AND REGEXP_LIKE(s.text, '^\s*$')
GROUP BY t.package_name, t.module_name, t.module_type, t.overload, t.spec_start GROUP BY t.package_name, t.module_name, t.module_type, t.overload, t.spec_start
) d ) d
LEFT JOIN user_source x LEFT JOIN s
ON x.name = d.package_name ON s.name = d.package_name
AND x.type = 'PACKAGE' AND s.type = 'PACKAGE'
AND x.line BETWEEN d.doc_start AND d.doc_end AND s.line BETWEEN d.doc_start AND d.doc_end
AND NOT REGEXP_LIKE(x.text, '^\s*--\s*$') AND NOT REGEXP_LIKE(s.text, '^\s*--\s*$')
GROUP BY d.package_name, d.module_name, d.module_type, d.overload GROUP BY d.package_name, d.module_name, d.module_type, d.overload
), ),
g AS ( g AS (
-- group for related modules
SELECT SELECT
s.name, s.name,
s.line, s.line,
@ -115,9 +137,21 @@ g AS (
RPAD(' ', ROW_NUMBER() OVER(ORDER BY s.line DESC)) AS group_sort RPAD(' ', ROW_NUMBER() OVER(ORDER BY s.line DESC)) AS group_sort
FROM user_source s FROM user_source s
JOIN x JOIN x
ON s.name = NVL(x.package_name, s.name) ON s.name = NVL(x.package_name, s.name)
WHERE s.type = 'PACKAGE' AND (s.name LIKE x.search_packages || '%' ESCAPE '\' OR x.search_packages IS NULL)
WHERE s.type = 'PACKAGE'
AND REGEXP_LIKE(s.text, '^\s*--\s*###') AND REGEXP_LIKE(s.text, '^\s*--\s*###')
),
f AS (
-- search source code
SELECT t.package_name, t.module_name, t.overload
FROM t
JOIN s
ON s.name = t.package_name
AND s.type = 'PACKAGE BODY'
AND s.line BETWEEN t.body_start AND t.body_end
AND s.is_found_text = 'Y'
GROUP BY t.package_name, t.module_name, t.overload
) )
SELECT SELECT
t.package_name, t.package_name,
@ -134,7 +168,7 @@ SELECT
-- --
CASE WHEN t.module_type = 'FUNCTION' THEN 'Y' END AS is_function, CASE WHEN t.module_type = 'FUNCTION' THEN 'Y' END AS is_function,
CASE WHEN b.text IS NOT NULL THEN 'Y' END AS is_private, CASE WHEN b.text IS NOT NULL THEN 'Y' END AS is_private,
CASE WHEN a.text IS NOT NULL THEN 'Y' END AS is_autonomous, CASE WHEN n.text IS NOT NULL THEN 'Y' END AS is_autonomous,
CASE WHEN t.result_cache = 'YES' THEN 'Y' END AS is_cached, CASE WHEN t.result_cache = 'YES' THEN 'Y' END AS is_cached,
CASE WHEN t.authid = 'DEFINER' THEN 'Y' END AS is_definer, CASE WHEN t.authid = 'DEFINER' THEN 'Y' END AS is_definer,
-- --
@ -153,26 +187,33 @@ FROM t
JOIN x JOIN x
ON t.package_name = NVL(x.package_name, t.package_name) ON t.package_name = NVL(x.package_name, t.package_name)
AND SUBSTR(t.module_type, 1, 1) = NVL(x.module_type, SUBSTR(t.module_type, 1, 1)) AND SUBSTR(t.module_type, 1, 1) = NVL(x.module_type, SUBSTR(t.module_type, 1, 1))
LEFT JOIN a --
AND (t.package_name LIKE x.search_packages || '%' ESCAPE '\' OR x.search_packages IS NULL)
AND (t.module_name LIKE x.search_modules || '%' ESCAPE '\' OR x.search_modules IS NULL)
JOIN a
ON a.package_name = t.package_name ON a.package_name = t.package_name
AND a.module_name = t.module_name AND a.module_name = t.module_name
AND a.module_type = t.module_type AND NVL(a.overload, 0) = NVL(t.overload, 0)
AND NVL(a.overload, 1) = NVL(t.overload, 1) AND (a.is_arg_present = 'Y' OR x.search_arguments IS NULL)
LEFT JOIN d JOIN d
ON d.package_name = t.package_name ON d.package_name = t.package_name
AND d.module_name = t.module_name AND d.module_name = t.module_name
AND d.module_type = t.module_type AND NVL(d.overload, 0) = NVL(t.overload, 0)
AND NVL(d.overload, 1) = NVL(t.overload, 1) LEFT JOIN s b
LEFT JOIN user_source b ON b.name = t.package_name
ON b.name = t.package_name AND b.type = 'PACKAGE'
AND b.type = 'PACKAGE' AND b.line BETWEEN t.spec_start AND t.spec_end
AND b.line BETWEEN t.spec_start AND t.spec_end
AND REGEXP_LIKE(b.text, '^\s*(ACCESSIBLE BY)') AND REGEXP_LIKE(b.text, '^\s*(ACCESSIBLE BY)')
LEFT JOIN user_source a LEFT JOIN s n
ON a.name = t.package_name ON n.name = t.package_name
AND a.type = 'PACKAGE BODY' AND n.type = 'PACKAGE BODY'
AND a.line BETWEEN t.body_start AND t.body_end AND n.line BETWEEN t.body_start AND t.body_end
AND REGEXP_LIKE(a.text, 'PRAGMA\s+AUTONOMOUS_TRANSACTION'); AND REGEXP_LIKE(n.text, 'PRAGMA\s+AUTONOMOUS_TRANSACTION')
LEFT JOIN f
ON f.package_name = t.package_name
AND f.module_name = t.module_name
AND NVL(f.overload, 0) = NVL(t.overload, 0)
WHERE (f.module_name IS NOT NULL OR x.search_source IS NULL);
-- --
COMMENT ON TABLE obj_modules IS 'Find package modules (procedures and functions) and their boundaries (start-end lines)'; COMMENT ON TABLE obj_modules IS 'Find package modules (procedures and functions) and their boundaries (start-end lines)';
-- --

View File

@ -1,45 +1,48 @@
CREATE OR REPLACE VIEW obj_packages AS CREATE OR REPLACE VIEW obj_packages AS
WITH x AS ( WITH s AS (
SELECT /*+ MATERIALIZE */
app.get_item('$PACKAGE_NAME') AS package_name
FROM DUAL
),
s AS (
SELECT SELECT
s.name AS package_name, s.name AS package_name,
COUNT(*) AS count_lines COUNT(s.line) AS count_lines
FROM user_source s FROM user_source s
WHERE s.type = 'PACKAGE BODY' JOIN (
SELECT m.package_name
FROM obj_modules m
GROUP BY m.package_name
) m
ON m.package_name = s.name
WHERE s.type = 'PACKAGE BODY'
GROUP BY s.name GROUP BY s.name
), ),
f AS ( f AS (
SELECT SELECT
a.package_name, a.package_name,
SUM(CASE WHEN a.position = 0 THEN 1 ELSE 0 END) AS count_functions SUM(CASE WHEN a.position = 0 THEN 1 ELSE 0 END) AS count_functions
FROM user_arguments a FROM s
LEFT JOIN user_arguments a
ON a.package_name = s.package_name
GROUP BY a.package_name GROUP BY a.package_name
) )
SELECT SELECT
p.object_name AS package_name, p.object_name AS package_name,
-- --
COUNT(p.procedure_name) - MIN(f.count_functions) AS count_procedures, COUNT(p.procedure_name) - MIN(f.count_functions) AS count_procedures,
-- --
MIN(f.count_functions) AS count_functions, MIN(f.count_functions) AS count_functions,
MAX(s.count_lines) AS count_lines, MAX(s.count_lines) AS count_lines,
MAX(o.last_ddl_time) AS last_ddl_time, MAX(o.last_ddl_time) AS last_ddl_time,
-- --
-- dependencies? -- @TODO: dependencies?
-- --
NULL AS desc_ NULL AS desc_ -- @TODO: get from specification
FROM user_objects o FROM user_objects o
CROSS JOIN x
JOIN user_procedures p JOIN user_procedures p
ON p.object_name = o.object_name ON p.object_name = o.object_name
AND o.object_type = 'PACKAGE' AND o.object_type = 'PACKAGE'
JOIN s JOIN s
ON s.package_name = p.object_name ON s.package_name = p.object_name
LEFT JOIN f JOIN f
ON f.package_name = p.object_name ON f.package_name = p.object_name
WHERE o.object_name = NVL(x.package_name, o.object_name)
GROUP BY p.object_name; GROUP BY p.object_name;
--
COMMENT ON TABLE obj_packages IS 'List of packages';