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_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(
p_id=>wwv_flow_api.id(14931272082872321)
,p_plug_name=>'Packages'
,p_parent_plug_id=>wwv_flow_api.id(21452402618924104)
,p_icon_css_classes=>'fa-table-pointer'
,p_region_template_options=>'#DEFAULT#'
,p_plug_template=>wwv_flow_api.id(9070356145569920)
,p_plug_display_sequence=>10
,p_include_in_reg_disp_sel_yn=>'Y'
,p_plug_display_sequence=>30
,p_plug_display_point=>'BODY'
,p_plug_query_options=>'DERIVED_REPORT_COLUMNS'
,p_attribute_01=>'N'
@ -41,10 +53,10 @@ wwv_flow_api.create_page_plug(
p_id=>wwv_flow_api.id(14931328612872322)
,p_plug_name=>'Packages [GRID]'
,p_region_name=>'PACKAGES'
,p_parent_plug_id=>wwv_flow_api.id(21452402618924104)
,p_region_template_options=>'#DEFAULT#'
,p_plug_template=>wwv_flow_api.id(9078290074569925)
,p_plug_display_sequence=>20
,p_include_in_reg_disp_sel_yn=>'Y'
,p_plug_display_sequence=>40
,p_plug_display_point=>'BODY'
,p_query_type=>'TABLE'
,p_query_table=>'OBJ_PACKAGES'
@ -361,17 +373,29 @@ wwv_flow_api.create_ig_report_column(
,p_is_frozen=>false
);
wwv_flow_api.create_page_plug(
p_id=>wwv_flow_api.id(14931458804872323)
,p_plug_name=>'Package Modules'
,p_icon_css_classes=>'fa-table-search'
p_id=>wwv_flow_api.id(21452599953924105)
,p_plug_name=>'MODULES'
,p_region_template_options=>'#DEFAULT#'
,p_plug_template=>wwv_flow_api.id(9070356145569920)
,p_plug_display_sequence=>30
,p_plug_template=>wwv_flow_api.id(9049155795569902)
,p_plug_display_sequence=>20
,p_include_in_reg_disp_sel_yn=>'Y'
,p_plug_display_point=>'BODY'
,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_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_02=>'HTML'
);
@ -379,11 +403,11 @@ wwv_flow_api.create_page_plug(
p_id=>wwv_flow_api.id(14931574823872324)
,p_plug_name=>'Package Modules [GRID]'
,p_region_name=>'MODULES'
,p_parent_plug_id=>wwv_flow_api.id(21452599953924105)
,p_region_template_options=>'#DEFAULT#'
,p_component_template_options=>'#DEFAULT#'
,p_plug_template=>wwv_flow_api.id(9078290074569925)
,p_plug_display_sequence=>40
,p_include_in_reg_disp_sel_yn=>'Y'
,p_plug_display_sequence=>50
,p_plug_display_point=>'BODY'
,p_query_type=>'TABLE'
,p_query_table=>'OBJ_MODULES'
@ -393,8 +417,6 @@ wwv_flow_api.create_page_plug(
,p_include_rowid_column=>false
,p_plug_source_type=>'NATIVE_IG'
,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_document_header=>'APEX'
,p_prn_units=>'MILLIMETERS'
@ -1005,12 +1027,16 @@ wwv_flow_api.create_ig_report_view(
wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(15054580481502742)
,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_is_visible=>false
,p_is_frozen=>false
,p_width=>200
,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_nulls=>'LAST'
);
@ -1089,6 +1115,18 @@ wwv_flow_api.create_ig_report_column(
,p_is_frozen=>false
,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(
p_id=>wwv_flow_api.id(15063524211502764)
,p_view_id=>wwv_flow_api.id(15054065173502740)
@ -1116,18 +1154,6 @@ wwv_flow_api.create_ig_report_column(
,p_is_frozen=>false
,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(
p_id=>wwv_flow_api.id(15066272572502771)
,p_view_id=>wwv_flow_api.id(15054065173502740)
@ -1184,6 +1210,21 @@ wwv_flow_api.create_ig_report_column(
,p_is_frozen=>false
,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(
p_id=>wwv_flow_api.id(15123829307615721)
,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_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(
p_id=>wwv_flow_api.id(15123714972615720)
,p_name=>'P960_PACKAGE_NAME'
@ -1213,6 +1286,184 @@ wwv_flow_api.create_page_item(
,p_display_as=>'NATIVE_HIDDEN'
,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;
end;
/

View File

@ -1,8 +1,13 @@
CREATE OR REPLACE VIEW obj_modules AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_item('$PACKAGE_NAME') AS package_name,
app.get_item('$MODULE_TYPE') AS module_type
app.get_item('$PACKAGE_NAME') AS package_name,
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
),
p AS (
@ -29,16 +34,27 @@ p AS (
AND NVL(p.overload, 1) = 1
JOIN x
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')
AND i.object_type IN ('PACKAGE', 'PACKAGE BODY')
AND i.usage = CASE s.type WHEN 'PACKAGE BODY' THEN 'DEFINITION' ELSE 'DECLARATION' END
),
e AS (
-- find ending lines
SELECT s.*
s AS (
SELECT
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
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 (
(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), ';'))
@ -70,44 +86,50 @@ t AS (
a AS (
-- arguments
SELECT
a.package_name,
a.object_name AS module_name,
MIN(CASE WHEN a.in_out = 'OUT' AND a.position = 0 THEN 'FUNCTION' ELSE 'PROCEDURE' END) AS module_type,
a.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
FROM user_arguments a
JOIN x
ON a.package_name = NVL(x.package_name, a.package_name)
GROUP BY a.package_name, a.object_name, a.overload
t.package_name,
t.module_name,
t.module_type,
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,
MAX(CASE WHEN (a.argument_name LIKE x.search_arguments || '%' ESCAPE '\') THEN 'Y' END) AS is_arg_present
FROM t
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 (
-- documentation lines
SELECT
d.package_name, d.module_name, d.module_type, d.overload, --x.line, x.text
LISTAGG(REGEXP_SUBSTR(x.text, '^\s*--\s*(.*)\s*$', 1, 1, NULL, 1), '<br />') WITHIN GROUP (ORDER BY x.line) AS comment_,
MIN(x.line) AS doc_start
d.package_name, d.module_name, d.module_type, d.overload, --s.line, s.text
LISTAGG(REGEXP_SUBSTR(s.text, '^\s*--\s*(.*)\s*$', 1, 1, NULL, 1), '<br />') WITHIN GROUP (ORDER BY s.line) AS comment_,
MIN(s.line) AS doc_start
FROM (
SELECT
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
FROM t
LEFT JOIN user_source x
ON x.name = t.package_name
AND x.type = 'PACKAGE'
AND x.line < t.spec_start
AND REGEXP_LIKE(x.text, '^\s*$')
LEFT JOIN s
ON s.name = t.package_name
AND s.type = 'PACKAGE'
AND s.line < t.spec_start
AND REGEXP_LIKE(s.text, '^\s*$')
GROUP BY t.package_name, t.module_name, t.module_type, t.overload, t.spec_start
) d
LEFT JOIN user_source x
ON x.name = d.package_name
AND x.type = 'PACKAGE'
AND x.line BETWEEN d.doc_start AND d.doc_end
AND NOT REGEXP_LIKE(x.text, '^\s*--\s*$')
LEFT JOIN s
ON s.name = d.package_name
AND s.type = 'PACKAGE'
AND s.line BETWEEN d.doc_start AND d.doc_end
AND NOT REGEXP_LIKE(s.text, '^\s*--\s*$')
GROUP BY d.package_name, d.module_name, d.module_type, d.overload
),
g AS (
-- group for related modules
SELECT
s.name,
s.line,
@ -115,9 +137,21 @@ g AS (
RPAD(' ', ROW_NUMBER() OVER(ORDER BY s.line DESC)) AS group_sort
FROM user_source s
JOIN x
ON s.name = NVL(x.package_name, s.name)
WHERE s.type = 'PACKAGE'
ON s.name = NVL(x.package_name, s.name)
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*###')
),
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
t.package_name,
@ -134,7 +168,7 @@ SELECT
--
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 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.authid = 'DEFINER' THEN 'Y' END AS is_definer,
--
@ -153,26 +187,33 @@ FROM t
JOIN x
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))
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
AND a.module_name = t.module_name
AND a.module_type = t.module_type
AND NVL(a.overload, 1) = NVL(t.overload, 1)
LEFT JOIN d
AND NVL(a.overload, 0) = NVL(t.overload, 0)
AND (a.is_arg_present = 'Y' OR x.search_arguments IS NULL)
JOIN d
ON d.package_name = t.package_name
AND d.module_name = t.module_name
AND d.module_type = t.module_type
AND NVL(d.overload, 1) = NVL(t.overload, 1)
LEFT JOIN user_source b
ON b.name = t.package_name
AND b.type = 'PACKAGE'
AND b.line BETWEEN t.spec_start AND t.spec_end
AND NVL(d.overload, 0) = NVL(t.overload, 0)
LEFT JOIN s b
ON b.name = t.package_name
AND b.type = 'PACKAGE'
AND b.line BETWEEN t.spec_start AND t.spec_end
AND REGEXP_LIKE(b.text, '^\s*(ACCESSIBLE BY)')
LEFT JOIN user_source a
ON a.name = t.package_name
AND a.type = 'PACKAGE BODY'
AND a.line BETWEEN t.body_start AND t.body_end
AND REGEXP_LIKE(a.text, 'PRAGMA\s+AUTONOMOUS_TRANSACTION');
LEFT JOIN s n
ON n.name = t.package_name
AND n.type = 'PACKAGE BODY'
AND n.line BETWEEN t.body_start AND t.body_end
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)';
--

View File

@ -1,45 +1,48 @@
CREATE OR REPLACE VIEW obj_packages AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_item('$PACKAGE_NAME') AS package_name
FROM DUAL
),
s AS (
WITH s AS (
SELECT
s.name AS package_name,
COUNT(*) AS count_lines
s.name AS package_name,
COUNT(s.line) AS count_lines
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
),
f AS (
SELECT
a.package_name,
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
)
SELECT
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,
MAX(s.count_lines) AS count_lines,
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
CROSS JOIN x
JOIN user_procedures p
ON p.object_name = o.object_name
AND o.object_type = 'PACKAGE'
ON p.object_name = o.object_name
AND o.object_type = 'PACKAGE'
JOIN s
ON s.package_name = p.object_name
LEFT JOIN f
ON f.package_name = p.object_name
WHERE o.object_name = NVL(x.package_name, o.object_name)
ON s.package_name = p.object_name
JOIN f
ON f.package_name = p.object_name
GROUP BY p.object_name;
--
COMMENT ON TABLE obj_packages IS 'List of packages';