again cleanup
This commit is contained in:
parent
190bcb67ec
commit
51634535a9
17
.editorconfig
Normal file
17
.editorconfig
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# EditorConfig is awesome: https://EditorConfig.org
|
||||||
|
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.{md}]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[*.{sql,pks,pkb,json}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.{sql,pks,pkb,json,md,txt,bat}]
|
||||||
|
charset = utf-8
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -3,3 +3,5 @@ temp
|
|||||||
demo.sql
|
demo.sql
|
||||||
L_XE*.sql
|
L_XE*.sql
|
||||||
*.zip
|
*.zip
|
||||||
|
plex_install_SYS.bat
|
||||||
|
plex_install_APEX_190100.bat
|
||||||
|
|||||||
416
PLEX.pkb
416
PLEX.pkb
@ -22,8 +22,7 @@ TYPE rec_runlog_step IS RECORD (
|
|||||||
start_time TIMESTAMP(6),
|
start_time TIMESTAMP(6),
|
||||||
stop_time TIMESTAMP(6),
|
stop_time TIMESTAMP(6),
|
||||||
elapsed NUMBER,
|
elapsed NUMBER,
|
||||||
execution NUMBER
|
execution NUMBER);
|
||||||
);
|
|
||||||
TYPE tab_runlog_step IS TABLE OF rec_runlog_step INDEX BY BINARY_INTEGER;
|
TYPE tab_runlog_step IS TABLE OF rec_runlog_step INDEX BY BINARY_INTEGER;
|
||||||
|
|
||||||
TYPE rec_runlog IS RECORD (
|
TYPE rec_runlog IS RECORD (
|
||||||
@ -33,37 +32,31 @@ TYPE rec_runlog IS RECORD (
|
|||||||
run_time NUMBER,
|
run_time NUMBER,
|
||||||
measured_time NUMBER,
|
measured_time NUMBER,
|
||||||
unmeasured_time NUMBER,
|
unmeasured_time NUMBER,
|
||||||
data tab_runlog_step
|
data tab_runlog_step);
|
||||||
);
|
|
||||||
|
|
||||||
TYPE tab_vc1000 IS TABLE OF VARCHAR2(1000) INDEX BY BINARY_INTEGER;
|
|
||||||
|
|
||||||
TYPE rec_ddl_files IS RECORD (
|
|
||||||
sequences_ tab_vc1000,
|
|
||||||
tables_ tab_vc1000,
|
|
||||||
ref_constraints_ tab_vc1000,
|
|
||||||
indices_ tab_vc1000,
|
|
||||||
views_ tab_vc1000,
|
|
||||||
types_ tab_vc1000,
|
|
||||||
type_bodies_ tab_vc1000,
|
|
||||||
triggers_ tab_vc1000,
|
|
||||||
functions_ tab_vc1000,
|
|
||||||
procedures_ tab_vc1000,
|
|
||||||
packages_ tab_vc1000,
|
|
||||||
package_bodies_ tab_vc1000,
|
|
||||||
grants_ tab_vc1000,
|
|
||||||
other_objects_ tab_vc1000
|
|
||||||
);
|
|
||||||
|
|
||||||
TYPE rec_queries IS RECORD (--
|
TYPE rec_queries IS RECORD (--
|
||||||
query VARCHAR2(32767 CHAR),
|
query VARCHAR2(32767 CHAR),
|
||||||
file_name VARCHAR2(256 CHAR),
|
file_name VARCHAR2(256 CHAR),
|
||||||
max_rows NUMBER DEFAULT 100000
|
max_rows NUMBER DEFAULT 100000);
|
||||||
);
|
TYPE tab_queries IS TABLE OF rec_queries INDEX BY BINARY_INTEGER;
|
||||||
TYPE tab_queries IS TABLE OF rec_queries INDEX BY PLS_INTEGER;
|
|
||||||
|
|
||||||
TYPE tab_file_list_lookup IS TABLE OF PLS_INTEGER INDEX BY VARCHAR2(256);
|
TYPE tab_file_list_lookup IS TABLE OF PLS_INTEGER INDEX BY VARCHAR2(256);
|
||||||
|
|
||||||
|
TYPE rec_ddl_files IS RECORD (
|
||||||
|
sequences_ tab_vc1k,
|
||||||
|
tables_ tab_vc1k,
|
||||||
|
ref_constraints_ tab_vc1k,
|
||||||
|
indices_ tab_vc1k,
|
||||||
|
views_ tab_vc1k,
|
||||||
|
types_ tab_vc1k,
|
||||||
|
type_bodies_ tab_vc1k,
|
||||||
|
triggers_ tab_vc1k,
|
||||||
|
functions_ tab_vc1k,
|
||||||
|
procedures_ tab_vc1k,
|
||||||
|
packages_ tab_vc1k,
|
||||||
|
package_bodies_ tab_vc1k,
|
||||||
|
grants_ tab_vc1k,
|
||||||
|
other_objects_ tab_vc1k);
|
||||||
|
|
||||||
|
|
||||||
-- GLOBAL VARIABLES
|
-- GLOBAL VARIABLES
|
||||||
g_clob CLOB;
|
g_clob CLOB;
|
||||||
@ -79,28 +72,24 @@ g_queries tab_queries;
|
|||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
$if not $$utils_public $then
|
$if not $$utils_public $then
|
||||||
FUNCTION util_bool_to_string (
|
FUNCTION util_bool_to_string (p_bool IN BOOLEAN) RETURN VARCHAR2;
|
||||||
p_bool IN BOOLEAN
|
|
||||||
) RETURN VARCHAR2;
|
|
||||||
|
|
||||||
FUNCTION util_string_to_bool (
|
FUNCTION util_string_to_bool (
|
||||||
p_bool_string IN VARCHAR2,
|
p_bool_string IN VARCHAR2,
|
||||||
p_default IN BOOLEAN
|
p_default IN BOOLEAN)
|
||||||
) RETURN BOOLEAN;
|
RETURN BOOLEAN;
|
||||||
|
|
||||||
FUNCTION util_split (
|
FUNCTION util_split (
|
||||||
p_string IN VARCHAR2,
|
p_string IN VARCHAR2,
|
||||||
p_delimiter IN VARCHAR2 DEFAULT ','
|
p_delimiter IN VARCHAR2 DEFAULT ',')
|
||||||
) RETURN tab_varchar2;
|
RETURN tab_vc32k;
|
||||||
|
|
||||||
FUNCTION util_join (
|
FUNCTION util_join (
|
||||||
p_array IN tab_varchar2,
|
p_array IN tab_vc32k,
|
||||||
p_delimiter IN VARCHAR2 DEFAULT ','
|
p_delimiter IN VARCHAR2 DEFAULT ',')
|
||||||
) RETURN VARCHAR2;
|
RETURN VARCHAR2;
|
||||||
|
|
||||||
FUNCTION util_clob_to_blob (
|
FUNCTION util_clob_to_blob (p_clob CLOB) RETURN BLOB;
|
||||||
p_clob CLOB
|
|
||||||
) RETURN BLOB;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZIP UTILS
|
ZIP UTILS
|
||||||
@ -113,20 +102,20 @@ ZIP UTILS
|
|||||||
FUNCTION util_zip_blob_to_num (
|
FUNCTION util_zip_blob_to_num (
|
||||||
p_blob IN BLOB,
|
p_blob IN BLOB,
|
||||||
p_len IN INTEGER,
|
p_len IN INTEGER,
|
||||||
p_pos IN INTEGER
|
p_pos IN INTEGER)
|
||||||
) RETURN NUMBER;
|
RETURN NUMBER;
|
||||||
|
|
||||||
FUNCTION util_zip_little_endian (
|
FUNCTION util_zip_little_endian (
|
||||||
p_big IN NUMBER,
|
p_big IN NUMBER,
|
||||||
p_bytes IN PLS_INTEGER := 4
|
p_bytes IN PLS_INTEGER := 4)
|
||||||
) RETURN RAW;
|
RETURN RAW;
|
||||||
|
|
||||||
PROCEDURE util_zip_add_file (
|
PROCEDURE util_zip_add_file (
|
||||||
p_zipped_blob IN OUT BLOB,
|
p_zipped_blob IN OUT BLOB,
|
||||||
p_name IN VARCHAR2,
|
p_name IN VARCHAR2,
|
||||||
p_content IN BLOB
|
p_content IN BLOB);
|
||||||
);
|
|
||||||
PROCEDURE util_zip_finish (
|
PROCEDURE util_zip_finish (p_zipped_blob IN OUT BLOB);
|
||||||
p_zipped_blob IN OUT BLOB
|
|
||||||
);
|
|
||||||
|
|
||||||
FUNCTION util_multi_replace (
|
FUNCTION util_multi_replace (
|
||||||
p_source_string VARCHAR2,
|
p_source_string VARCHAR2,
|
||||||
@ -141,16 +130,12 @@ FUNCTION util_multi_replace (
|
|||||||
p_09_find VARCHAR2 DEFAULT NULL, p_09_replace VARCHAR2 DEFAULT NULL,
|
p_09_find VARCHAR2 DEFAULT NULL, p_09_replace VARCHAR2 DEFAULT NULL,
|
||||||
p_10_find VARCHAR2 DEFAULT NULL, p_10_replace VARCHAR2 DEFAULT NULL,
|
p_10_find VARCHAR2 DEFAULT NULL, p_10_replace VARCHAR2 DEFAULT NULL,
|
||||||
p_11_find VARCHAR2 DEFAULT NULL, p_11_replace VARCHAR2 DEFAULT NULL,
|
p_11_find VARCHAR2 DEFAULT NULL, p_11_replace VARCHAR2 DEFAULT NULL,
|
||||||
p_12_find VARCHAR2 DEFAULT NULL, p_12_replace VARCHAR2 DEFAULT NULL
|
p_12_find VARCHAR2 DEFAULT NULL, p_12_replace VARCHAR2 DEFAULT NULL)
|
||||||
) RETURN VARCHAR2;
|
RETURN VARCHAR2;
|
||||||
|
|
||||||
FUNCTION util_set_build_status_run_only (
|
FUNCTION util_set_build_status_run_only (p_app_export_sql IN CLOB) RETURN CLOB;
|
||||||
p_app_export_sql IN CLOB
|
|
||||||
) RETURN CLOB;
|
|
||||||
|
|
||||||
FUNCTION util_calc_data_timestamp (
|
FUNCTION util_calc_data_timestamp (p_as_of_minutes_ago IN NUMBER) RETURN TIMESTAMP;
|
||||||
p_as_of_minutes_ago IN NUMBER
|
|
||||||
) RETURN TIMESTAMP;
|
|
||||||
|
|
||||||
PROCEDURE util_setup_dbms_metadata (
|
PROCEDURE util_setup_dbms_metadata (
|
||||||
p_pretty IN BOOLEAN DEFAULT true,
|
p_pretty IN BOOLEAN DEFAULT true,
|
||||||
@ -162,66 +147,47 @@ PROCEDURE util_setup_dbms_metadata (
|
|||||||
p_segment_attributes IN BOOLEAN DEFAULT false,
|
p_segment_attributes IN BOOLEAN DEFAULT false,
|
||||||
p_sqlterminator IN BOOLEAN DEFAULT true,
|
p_sqlterminator IN BOOLEAN DEFAULT true,
|
||||||
p_constraints_as_alter IN BOOLEAN DEFAULT false,
|
p_constraints_as_alter IN BOOLEAN DEFAULT false,
|
||||||
p_emit_schema IN BOOLEAN DEFAULT false
|
p_emit_schema IN BOOLEAN DEFAULT false);
|
||||||
);
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- The following tools are working on the global private package variables g_clob, g_clob_varchar_cache, g_runlog and g_queries
|
-- The following tools are working on the global private package variables g_clob, g_clob_varchar_cache, g_runlog and g_queries
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PROCEDURE util_clob_append (
|
PROCEDURE util_clob_append (p_content IN VARCHAR2);
|
||||||
p_content IN VARCHAR2
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_clob_append (
|
PROCEDURE util_clob_append (p_content IN CLOB);
|
||||||
p_content IN CLOB
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_clob_flush_cache;
|
PROCEDURE util_clob_flush_cache;
|
||||||
|
|
||||||
PROCEDURE util_clob_add_to_export_files (
|
PROCEDURE util_clob_add_to_export_files (
|
||||||
p_export_files IN OUT NOCOPY tab_export_files,
|
p_export_files IN OUT NOCOPY tab_export_files,
|
||||||
p_name IN VARCHAR2
|
p_name IN VARCHAR2);
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_clob_query_to_csv (
|
PROCEDURE util_clob_query_to_csv (
|
||||||
p_query IN VARCHAR2,
|
p_query IN VARCHAR2,
|
||||||
p_max_rows IN NUMBER DEFAULT 1000,
|
p_max_rows IN NUMBER DEFAULT 1000,
|
||||||
p_delimiter IN VARCHAR2 DEFAULT ',',
|
p_delimiter IN VARCHAR2 DEFAULT ',',
|
||||||
p_quote_mark IN VARCHAR2 DEFAULT '"',
|
p_quote_mark IN VARCHAR2 DEFAULT '"',
|
||||||
p_header_prefix IN VARCHAR2 DEFAULT NULL
|
p_header_prefix IN VARCHAR2 DEFAULT NULL);
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_clob_create_runtime_log (
|
PROCEDURE util_clob_create_runtime_log (p_export_files IN OUT NOCOPY tab_export_files);
|
||||||
p_export_files IN OUT NOCOPY tab_export_files
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_clob_create_error_log (
|
PROCEDURE util_clob_create_error_log (p_export_files IN OUT NOCOPY tab_export_files);
|
||||||
p_export_files IN OUT NOCOPY tab_export_files
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_ensure_unique_file_names (
|
PROCEDURE util_ensure_unique_file_names (p_export_files IN OUT tab_export_files);
|
||||||
p_export_files IN OUT tab_export_files
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_log_init (
|
PROCEDURE util_log_init (p_module IN VARCHAR2);
|
||||||
p_module IN VARCHAR2
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_log_start (
|
PROCEDURE util_log_start (p_action IN VARCHAR2);
|
||||||
p_action IN VARCHAR2
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_log_error (
|
PROCEDURE util_log_error (p_name VARCHAR2);
|
||||||
p_name VARCHAR2
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_log_stop;
|
PROCEDURE util_log_stop;
|
||||||
|
|
||||||
FUNCTION util_log_get_runtime (
|
FUNCTION util_log_get_runtime (
|
||||||
p_start IN TIMESTAMP,
|
p_start IN TIMESTAMP,
|
||||||
p_stop IN TIMESTAMP
|
p_stop IN TIMESTAMP)
|
||||||
) RETURN NUMBER;
|
RETURN NUMBER;
|
||||||
|
|
||||||
PROCEDURE util_log_calc_runtimes;
|
PROCEDURE util_log_calc_runtimes;
|
||||||
|
|
||||||
@ -233,9 +199,7 @@ $end
|
|||||||
-- UTILITIES MAIN CODE
|
-- UTILITIES MAIN CODE
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
FUNCTION util_bool_to_string (
|
FUNCTION util_bool_to_string (p_bool IN BOOLEAN) RETURN VARCHAR2 IS
|
||||||
p_bool IN BOOLEAN
|
|
||||||
) RETURN VARCHAR2 IS
|
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN CASE WHEN p_bool THEN 'TRUE' ELSE 'FALSE' END;
|
RETURN CASE WHEN p_bool THEN 'TRUE' ELSE 'FALSE' END;
|
||||||
END util_bool_to_string;
|
END util_bool_to_string;
|
||||||
@ -244,8 +208,8 @@ END util_bool_to_string;
|
|||||||
|
|
||||||
FUNCTION util_string_to_bool (
|
FUNCTION util_string_to_bool (
|
||||||
p_bool_string IN VARCHAR2,
|
p_bool_string IN VARCHAR2,
|
||||||
p_default IN BOOLEAN
|
p_default IN BOOLEAN)
|
||||||
) RETURN BOOLEAN IS
|
RETURN BOOLEAN IS
|
||||||
v_bool_string VARCHAR2(1 CHAR);
|
v_bool_string VARCHAR2(1 CHAR);
|
||||||
v_return BOOLEAN;
|
v_return BOOLEAN;
|
||||||
BEGIN
|
BEGIN
|
||||||
@ -265,23 +229,21 @@ END util_string_to_bool;
|
|||||||
|
|
||||||
FUNCTION util_split (
|
FUNCTION util_split (
|
||||||
p_string IN VARCHAR2,
|
p_string IN VARCHAR2,
|
||||||
p_delimiter IN VARCHAR2 DEFAULT ','
|
p_delimiter IN VARCHAR2 DEFAULT ',')
|
||||||
) RETURN tab_varchar2 IS
|
RETURN tab_vc32k IS
|
||||||
v_return tab_varchar2 := tab_varchar2();
|
v_return tab_vc32k := tab_vc32k();
|
||||||
v_offset PLS_INTEGER := 1;
|
v_offset PLS_INTEGER := 1;
|
||||||
v_index PLS_INTEGER := instr(p_string, p_delimiter, v_offset);
|
v_index PLS_INTEGER := instr(p_string, p_delimiter, v_offset);
|
||||||
v_delimiter_length PLS_INTEGER := length(p_delimiter);
|
v_delimiter_length PLS_INTEGER := length(p_delimiter);
|
||||||
v_string_length CONSTANT PLS_INTEGER := length(p_string);
|
v_string_length CONSTANT PLS_INTEGER := length(p_string);
|
||||||
v_count PLS_INTEGER := 1;
|
v_count PLS_INTEGER := 1;
|
||||||
|
|
||||||
PROCEDURE add_value (
|
PROCEDURE add_value (p_value VARCHAR2) IS
|
||||||
p_value VARCHAR2
|
|
||||||
) IS
|
|
||||||
BEGIN
|
BEGIN
|
||||||
v_return.extend;
|
v_return.extend;
|
||||||
v_return(v_count) := p_value;
|
v_return(v_count) := p_value;
|
||||||
v_count := v_count + 1;
|
v_count := v_count + 1;
|
||||||
END;
|
END add_value;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
WHILE v_index > 0 LOOP
|
WHILE v_index > 0 LOOP
|
||||||
@ -298,9 +260,9 @@ END util_split;
|
|||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
FUNCTION util_join (
|
FUNCTION util_join (
|
||||||
p_array IN tab_varchar2,
|
p_array IN tab_vc32k,
|
||||||
p_delimiter IN VARCHAR2 DEFAULT ','
|
p_delimiter IN VARCHAR2 DEFAULT ',')
|
||||||
) RETURN VARCHAR2 IS
|
RETURN VARCHAR2 IS
|
||||||
v_return VARCHAR2(32767);
|
v_return VARCHAR2(32767);
|
||||||
BEGIN
|
BEGIN
|
||||||
IF p_array IS NOT NULL AND p_array.count > 0 THEN
|
IF p_array IS NOT NULL AND p_array.count > 0 THEN
|
||||||
@ -317,9 +279,7 @@ END util_join;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
FUNCTION util_clob_to_blob (
|
FUNCTION util_clob_to_blob (p_clob CLOB) RETURN BLOB IS
|
||||||
p_clob CLOB
|
|
||||||
) RETURN BLOB IS
|
|
||||||
v_blob BLOB;
|
v_blob BLOB;
|
||||||
v_lang_context INTEGER := dbms_lob.default_lang_ctx;
|
v_lang_context INTEGER := dbms_lob.default_lang_ctx;
|
||||||
v_warning INTEGER := dbms_lob.warn_inconvertible_char;
|
v_warning INTEGER := dbms_lob.warn_inconvertible_char;
|
||||||
@ -343,11 +303,12 @@ END util_clob_to_blob;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
FUNCTION util_zip_blob_to_num (-- copyright by Anton Scheffer (MIT license, see https://technology.amis.nl/2010/03/13/utl_compress-gzip-and-zlib/)
|
-- copyright by Anton Scheffer (MIT license, see https://technology.amis.nl/2010/03/13/utl_compress-gzip-and-zlib/)
|
||||||
|
FUNCTION util_zip_blob_to_num (
|
||||||
p_blob IN BLOB,
|
p_blob IN BLOB,
|
||||||
p_len IN INTEGER,
|
p_len IN INTEGER,
|
||||||
p_pos IN INTEGER
|
p_pos IN INTEGER)
|
||||||
) RETURN NUMBER IS
|
RETURN NUMBER IS
|
||||||
rv NUMBER;
|
rv NUMBER;
|
||||||
BEGIN
|
BEGIN
|
||||||
rv := utl_raw.cast_to_binary_integer(
|
rv := utl_raw.cast_to_binary_integer(
|
||||||
@ -364,8 +325,8 @@ END util_zip_blob_to_num;
|
|||||||
-- copyright by Anton Scheffer (MIT license, see https://technology.amis.nl/2010/03/13/utl_compress-gzip-and-zlib/)
|
-- copyright by Anton Scheffer (MIT license, see https://technology.amis.nl/2010/03/13/utl_compress-gzip-and-zlib/)
|
||||||
FUNCTION util_zip_little_endian (
|
FUNCTION util_zip_little_endian (
|
||||||
p_big IN NUMBER,
|
p_big IN NUMBER,
|
||||||
p_bytes IN PLS_INTEGER := 4
|
p_bytes IN PLS_INTEGER := 4)
|
||||||
) RETURN RAW IS
|
RETURN RAW IS
|
||||||
t_big NUMBER := p_big;
|
t_big NUMBER := p_big;
|
||||||
BEGIN
|
BEGIN
|
||||||
IF t_big > 2147483647 THEN
|
IF t_big > 2147483647 THEN
|
||||||
@ -380,8 +341,8 @@ END util_zip_little_endian;
|
|||||||
PROCEDURE util_zip_add_file (
|
PROCEDURE util_zip_add_file (
|
||||||
p_zipped_blob IN OUT BLOB,
|
p_zipped_blob IN OUT BLOB,
|
||||||
p_name IN VARCHAR2,
|
p_name IN VARCHAR2,
|
||||||
p_content IN BLOB
|
p_content IN BLOB)
|
||||||
) IS
|
IS
|
||||||
t_now DATE;
|
t_now DATE;
|
||||||
t_blob BLOB;
|
t_blob BLOB;
|
||||||
t_len INTEGER;
|
t_len INTEGER;
|
||||||
@ -402,10 +363,6 @@ BEGIN
|
|||||||
t_clen := t_len;
|
t_clen := t_len;
|
||||||
t_blob := p_content;
|
t_blob := p_content;
|
||||||
END IF;
|
END IF;
|
||||||
-- We create our temporary BLOB in to_zip and do not need it here:
|
|
||||||
-- IF p_zipped_blob IS NULL THEN
|
|
||||||
-- dbms_lob.createtemporary(p_zipped_blob, true);
|
|
||||||
-- END IF;
|
|
||||||
t_name := utl_i18n.string_to_raw(p_name, 'AL32UTF8');
|
t_name := utl_i18n.string_to_raw(p_name, 'AL32UTF8');
|
||||||
dbms_lob.append(
|
dbms_lob.append(
|
||||||
p_zipped_blob,
|
p_zipped_blob,
|
||||||
@ -449,9 +406,7 @@ END util_zip_add_file;
|
|||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
-- copyright by Anton Scheffer (MIT license, see https://technology.amis.nl/2010/03/13/utl_compress-gzip-and-zlib/)
|
-- copyright by Anton Scheffer (MIT license, see https://technology.amis.nl/2010/03/13/utl_compress-gzip-and-zlib/)
|
||||||
PROCEDURE util_zip_finish (
|
PROCEDURE util_zip_finish (p_zipped_blob IN OUT BLOB) IS
|
||||||
p_zipped_blob IN OUT BLOB
|
|
||||||
) IS
|
|
||||||
t_cnt PLS_INTEGER := 0;
|
t_cnt PLS_INTEGER := 0;
|
||||||
t_offs INTEGER;
|
t_offs INTEGER;
|
||||||
t_offs_dir_header INTEGER;
|
t_offs_dir_header INTEGER;
|
||||||
@ -521,8 +476,8 @@ FUNCTION util_multi_replace (
|
|||||||
p_09_find VARCHAR2 DEFAULT NULL, p_09_replace VARCHAR2 DEFAULT NULL,
|
p_09_find VARCHAR2 DEFAULT NULL, p_09_replace VARCHAR2 DEFAULT NULL,
|
||||||
p_10_find VARCHAR2 DEFAULT NULL, p_10_replace VARCHAR2 DEFAULT NULL,
|
p_10_find VARCHAR2 DEFAULT NULL, p_10_replace VARCHAR2 DEFAULT NULL,
|
||||||
p_11_find VARCHAR2 DEFAULT NULL, p_11_replace VARCHAR2 DEFAULT NULL,
|
p_11_find VARCHAR2 DEFAULT NULL, p_11_replace VARCHAR2 DEFAULT NULL,
|
||||||
p_12_find VARCHAR2 DEFAULT NULL, p_12_replace VARCHAR2 DEFAULT NULL
|
p_12_find VARCHAR2 DEFAULT NULL, p_12_replace VARCHAR2 DEFAULT NULL)
|
||||||
) RETURN VARCHAR2 IS
|
RETURN VARCHAR2 IS
|
||||||
v_return VARCHAR2(32767);
|
v_return VARCHAR2(32767);
|
||||||
BEGIN
|
BEGIN
|
||||||
v_return := p_source_string;
|
v_return := p_source_string;
|
||||||
@ -543,9 +498,7 @@ END util_multi_replace;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
FUNCTION util_set_build_status_run_only (
|
FUNCTION util_set_build_status_run_only (p_app_export_sql CLOB) RETURN CLOB IS
|
||||||
p_app_export_sql CLOB
|
|
||||||
) RETURN CLOB IS
|
|
||||||
v_position PLS_INTEGER;
|
v_position PLS_INTEGER;
|
||||||
BEGIN
|
BEGIN
|
||||||
v_position := instr(p_app_export_sql, ',p_exact_substitutions_only');
|
v_position := instr(p_app_export_sql, ',p_exact_substitutions_only');
|
||||||
@ -557,9 +510,7 @@ END util_set_build_status_run_only;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
FUNCTION util_calc_data_timestamp (
|
FUNCTION util_calc_data_timestamp (p_as_of_minutes_ago IN NUMBER) RETURN TIMESTAMP IS
|
||||||
p_as_of_minutes_ago IN NUMBER
|
|
||||||
) RETURN TIMESTAMP IS
|
|
||||||
v_return TIMESTAMP;
|
v_return TIMESTAMP;
|
||||||
BEGIN
|
BEGIN
|
||||||
EXECUTE IMMEDIATE
|
EXECUTE IMMEDIATE
|
||||||
@ -583,8 +534,8 @@ PROCEDURE util_setup_dbms_metadata (
|
|||||||
p_segment_attributes IN BOOLEAN DEFAULT false,
|
p_segment_attributes IN BOOLEAN DEFAULT false,
|
||||||
p_sqlterminator IN BOOLEAN DEFAULT true,
|
p_sqlterminator IN BOOLEAN DEFAULT true,
|
||||||
p_constraints_as_alter IN BOOLEAN DEFAULT false,
|
p_constraints_as_alter IN BOOLEAN DEFAULT false,
|
||||||
p_emit_schema IN BOOLEAN DEFAULT false
|
p_emit_schema IN BOOLEAN DEFAULT false)
|
||||||
) IS
|
IS
|
||||||
BEGIN
|
BEGIN
|
||||||
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'PRETTY', p_pretty);
|
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'PRETTY', p_pretty);
|
||||||
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'CONSTRAINTS', p_constraints);
|
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'CONSTRAINTS', p_constraints);
|
||||||
@ -600,9 +551,7 @@ END util_setup_dbms_metadata;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PROCEDURE util_ensure_unique_file_names (
|
PROCEDURE util_ensure_unique_file_names (p_export_files IN OUT tab_export_files) IS
|
||||||
p_export_files IN OUT tab_export_files
|
|
||||||
) IS
|
|
||||||
v_file_list_lookup tab_file_list_lookup;
|
v_file_list_lookup tab_file_list_lookup;
|
||||||
v_apex_install_file_id PLS_INTEGER;
|
v_apex_install_file_id PLS_INTEGER;
|
||||||
v_file_name VARCHAR2(256);
|
v_file_name VARCHAR2(256);
|
||||||
@ -611,7 +560,6 @@ PROCEDURE util_ensure_unique_file_names (
|
|||||||
v_count PLS_INTEGER;
|
v_count PLS_INTEGER;
|
||||||
BEGIN
|
BEGIN
|
||||||
util_log_start('ensure unique file names in collection');
|
util_log_start('ensure unique file names in collection');
|
||||||
--
|
|
||||||
$if $$apex_installed $then
|
$if $$apex_installed $then
|
||||||
-- find apex install file
|
-- find apex install file
|
||||||
FOR i IN 1..p_export_files.count LOOP
|
FOR i IN 1..p_export_files.count LOOP
|
||||||
@ -620,11 +568,9 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
$end
|
$end
|
||||||
--
|
|
||||||
FOR i IN 1..p_export_files.count LOOP
|
FOR i IN 1..p_export_files.count LOOP
|
||||||
v_file_name := p_export_files(i).name;
|
v_file_name := p_export_files(i).name;
|
||||||
v_count := 1;
|
v_count := 1;
|
||||||
--
|
|
||||||
IF instr(v_file_name, '.') > 0 THEN
|
IF instr(v_file_name, '.') > 0 THEN
|
||||||
v_base_name := substr(v_file_name, 1, instr(v_file_name, '.', -1) - 1);
|
v_base_name := substr(v_file_name, 1, instr(v_file_name, '.', -1) - 1);
|
||||||
v_extension := substr(v_file_name, instr(v_file_name, '.', -1));
|
v_extension := substr(v_file_name, instr(v_file_name, '.', -1));
|
||||||
@ -632,12 +578,10 @@ BEGIN
|
|||||||
v_base_name := v_file_name;
|
v_base_name := v_file_name;
|
||||||
v_extension := NULL;
|
v_extension := NULL;
|
||||||
END IF;
|
END IF;
|
||||||
--
|
|
||||||
WHILE v_file_list_lookup.EXISTS(v_file_name) LOOP
|
WHILE v_file_list_lookup.EXISTS(v_file_name) LOOP
|
||||||
v_count := v_count + 1;
|
v_count := v_count + 1;
|
||||||
v_file_name := v_base_name || '_' || v_count || v_extension;
|
v_file_name := v_base_name || '_' || v_count || v_extension;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
--
|
|
||||||
v_file_list_lookup(v_file_name) := i;
|
v_file_list_lookup(v_file_name) := i;
|
||||||
-- correct data if needed
|
-- correct data if needed
|
||||||
IF p_export_files(i).name != v_file_name THEN
|
IF p_export_files(i).name != v_file_name THEN
|
||||||
@ -652,9 +596,7 @@ BEGIN
|
|||||||
p_export_files(v_apex_install_file_id).contents,
|
p_export_files(v_apex_install_file_id).contents,
|
||||||
p_export_files(i).name || '$',
|
p_export_files(i).name || '$',
|
||||||
v_file_name,
|
v_file_name,
|
||||||
1,
|
1, 2, 'm');
|
||||||
2,
|
|
||||||
'm');
|
|
||||||
END IF;
|
END IF;
|
||||||
-- correct the file name itself
|
-- correct the file name itself
|
||||||
p_export_files(i).name := v_file_name;
|
p_export_files(i).name := v_file_name;
|
||||||
@ -665,9 +607,7 @@ END util_ensure_unique_file_names;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PROCEDURE util_log_init (
|
PROCEDURE util_log_init (p_module IN VARCHAR2) IS
|
||||||
p_module IN VARCHAR2
|
|
||||||
) IS
|
|
||||||
BEGIN
|
BEGIN
|
||||||
g_runlog.module := substr(p_module, 1, c_app_info_length);
|
g_runlog.module := substr(p_module, 1, c_app_info_length);
|
||||||
g_runlog.start_time := systimestamp;
|
g_runlog.start_time := systimestamp;
|
||||||
@ -681,9 +621,7 @@ END util_log_init;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PROCEDURE util_log_start (
|
PROCEDURE util_log_start (p_action IN VARCHAR2) IS
|
||||||
p_action IN VARCHAR2
|
|
||||||
) IS
|
|
||||||
v_index PLS_INTEGER;
|
v_index PLS_INTEGER;
|
||||||
BEGIN
|
BEGIN
|
||||||
dbms_application_info.set_module(
|
dbms_application_info.set_module(
|
||||||
@ -696,18 +634,14 @@ END util_log_start;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PROCEDURE util_log_error (
|
PROCEDURE util_log_error (p_name VARCHAR2) IS
|
||||||
p_name VARCHAR2
|
|
||||||
) IS
|
|
||||||
v_index PLS_INTEGER;
|
v_index PLS_INTEGER;
|
||||||
|
|
||||||
PROCEDURE add_error_to_action IS
|
PROCEDURE add_error_to_action IS
|
||||||
v_index PLS_INTEGER;
|
v_index PLS_INTEGER;
|
||||||
BEGIN
|
BEGIN
|
||||||
v_index := g_runlog.data.count;
|
v_index := g_runlog.data.count;
|
||||||
g_runlog.data(v_index).action := substr('ERROR: ' || g_runlog.data(v_index).action, 1, plex.c_app_info_length);
|
g_runlog.data(v_index).action := substr('ERROR: ' || g_runlog.data(v_index).action, 1, plex.c_app_info_length);
|
||||||
END add_error_to_action;
|
END add_error_to_action;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
v_index := g_errlog.count + 1;
|
v_index := g_errlog.count + 1;
|
||||||
g_errlog(v_index).time_stamp := systimestamp;
|
g_errlog(v_index).time_stamp := systimestamp;
|
||||||
@ -738,8 +672,8 @@ END util_log_stop;
|
|||||||
|
|
||||||
FUNCTION util_log_get_runtime (
|
FUNCTION util_log_get_runtime (
|
||||||
p_start IN TIMESTAMP,
|
p_start IN TIMESTAMP,
|
||||||
p_stop IN TIMESTAMP
|
p_stop IN TIMESTAMP)
|
||||||
) RETURN NUMBER IS
|
RETURN NUMBER IS
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN SYSDATE + ((p_stop - p_start) * 86400) - SYSDATE;
|
RETURN SYSDATE + ((p_stop - p_start) * 86400) - SYSDATE;
|
||||||
--sysdate + (interval_difference * 86400) - sysdate
|
--sysdate + (interval_difference * 86400) - sysdate
|
||||||
@ -757,9 +691,7 @@ END util_log_calc_runtimes;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PROCEDURE util_clob_append (
|
PROCEDURE util_clob_append (p_content IN VARCHAR2) IS
|
||||||
p_content IN VARCHAR2
|
|
||||||
) IS
|
|
||||||
BEGIN
|
BEGIN
|
||||||
g_clob_vc_cache := g_clob_vc_cache || p_content;
|
g_clob_vc_cache := g_clob_vc_cache || p_content;
|
||||||
EXCEPTION
|
EXCEPTION
|
||||||
@ -774,9 +706,7 @@ END util_clob_append;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PROCEDURE util_clob_append (
|
PROCEDURE util_clob_append (p_content IN CLOB) IS
|
||||||
p_content IN CLOB
|
|
||||||
) IS
|
|
||||||
BEGIN
|
BEGIN
|
||||||
IF p_content IS NOT NULL THEN
|
IF p_content IS NOT NULL THEN
|
||||||
util_clob_flush_cache;
|
util_clob_flush_cache;
|
||||||
@ -806,8 +736,8 @@ END util_clob_flush_cache;
|
|||||||
|
|
||||||
PROCEDURE util_clob_add_to_export_files (
|
PROCEDURE util_clob_add_to_export_files (
|
||||||
p_export_files IN OUT NOCOPY tab_export_files,
|
p_export_files IN OUT NOCOPY tab_export_files,
|
||||||
p_name IN VARCHAR2
|
p_name IN VARCHAR2)
|
||||||
) IS
|
IS
|
||||||
v_index PLS_INTEGER;
|
v_index PLS_INTEGER;
|
||||||
BEGIN
|
BEGIN
|
||||||
util_clob_flush_cache;
|
util_clob_flush_cache;
|
||||||
@ -826,8 +756,8 @@ PROCEDURE util_clob_query_to_csv (
|
|||||||
p_max_rows IN NUMBER DEFAULT 1000,
|
p_max_rows IN NUMBER DEFAULT 1000,
|
||||||
p_delimiter IN VARCHAR2 DEFAULT ',',
|
p_delimiter IN VARCHAR2 DEFAULT ',',
|
||||||
p_quote_mark IN VARCHAR2 DEFAULT '"',
|
p_quote_mark IN VARCHAR2 DEFAULT '"',
|
||||||
p_header_prefix IN VARCHAR2 DEFAULT NULL
|
p_header_prefix IN VARCHAR2 DEFAULT NULL)
|
||||||
) IS
|
IS
|
||||||
-- inspired by Tim Hall: https://oracle-base.com/dba/script?category=miscellaneous&file=csv.sql
|
-- inspired by Tim Hall: https://oracle-base.com/dba/script?category=miscellaneous&file=csv.sql
|
||||||
v_line_terminator VARCHAR2(2) := c_crlf; -- to be compatible with Excel we need to use crlf here (multiline text uses lf and is wrapped in quotes)
|
v_line_terminator VARCHAR2(2) := c_crlf; -- to be compatible with Excel we need to use crlf here (multiline text uses lf and is wrapped in quotes)
|
||||||
v_cursor PLS_INTEGER;
|
v_cursor PLS_INTEGER;
|
||||||
@ -872,13 +802,11 @@ PROCEDURE util_clob_query_to_csv (
|
|||||||
PROCEDURE escape_varchar2_buffer_for_csv IS
|
PROCEDURE escape_varchar2_buffer_for_csv IS
|
||||||
BEGIN
|
BEGIN
|
||||||
IF v_buffer_varchar2 IS NOT NULL THEN
|
IF v_buffer_varchar2 IS NOT NULL THEN
|
||||||
|
|
||||||
-- normalize line feeds for Excel
|
-- normalize line feeds for Excel
|
||||||
v_buffer_varchar2 := replace(
|
v_buffer_varchar2 := replace(
|
||||||
replace(v_buffer_varchar2, c_crlf, c_lf),
|
replace(v_buffer_varchar2, c_crlf, c_lf),
|
||||||
c_cr,
|
c_cr,
|
||||||
c_lf);
|
c_lf);
|
||||||
|
|
||||||
-- if we have the parameter p_force_quotes set to true or the delimiter character or
|
-- if we have the parameter p_force_quotes set to true or the delimiter character or
|
||||||
-- line feeds in the string then we have to wrap the text in quotes marks and escape
|
-- line feeds in the string then we have to wrap the text in quotes marks and escape
|
||||||
-- the quote marks inside the text by double them
|
-- the quote marks inside the text by double them
|
||||||
@ -887,7 +815,6 @@ PROCEDURE util_clob_query_to_csv (
|
|||||||
|| replace(v_buffer_varchar2, p_quote_mark, p_quote_mark || p_quote_mark)
|
|| replace(v_buffer_varchar2, p_quote_mark, p_quote_mark || p_quote_mark)
|
||||||
|| p_quote_mark;
|
|| p_quote_mark;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
END IF;
|
END IF;
|
||||||
EXCEPTION
|
EXCEPTION
|
||||||
WHEN value_error THEN
|
WHEN value_error THEN
|
||||||
@ -903,9 +830,7 @@ BEGIN
|
|||||||
dbms_sql.native);
|
dbms_sql.native);
|
||||||
-- https://support.esri.com/en/technical-article/000010110
|
-- https://support.esri.com/en/technical-article/000010110
|
||||||
-- http://bluefrog-oracle.blogspot.com/2011/11/describing-ref-cursor-using-dbmssql-api.html
|
-- http://bluefrog-oracle.blogspot.com/2011/11/describing-ref-cursor-using-dbmssql-api.html
|
||||||
|
|
||||||
dbms_sql.describe_columns3(v_cursor, v_col_cnt, v_desc_tab);
|
dbms_sql.describe_columns3(v_cursor, v_col_cnt, v_desc_tab);
|
||||||
|
|
||||||
FOR i IN 1..v_col_cnt LOOP
|
FOR i IN 1..v_col_cnt LOOP
|
||||||
IF v_desc_tab(i).col_type = c_clob THEN
|
IF v_desc_tab(i).col_type = c_clob THEN
|
||||||
dbms_sql.define_column(v_cursor, i, v_buffer_clob);
|
dbms_sql.define_column(v_cursor, i, v_buffer_clob);
|
||||||
@ -919,10 +844,7 @@ BEGIN
|
|||||||
dbms_sql.define_column(v_cursor, i, v_buffer_varchar2, c_vc2_max_size);
|
dbms_sql.define_column(v_cursor, i, v_buffer_varchar2, c_vc2_max_size);
|
||||||
END IF;
|
END IF;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
v_ignore_me := dbms_sql.execute(v_cursor);
|
v_ignore_me := dbms_sql.execute(v_cursor);
|
||||||
|
|
||||||
-- create header
|
|
||||||
util_clob_append(p_header_prefix);
|
util_clob_append(p_header_prefix);
|
||||||
FOR i IN 1..v_col_cnt LOOP
|
FOR i IN 1..v_col_cnt LOOP
|
||||||
IF i > 1 THEN
|
IF i > 1 THEN
|
||||||
@ -932,13 +854,10 @@ BEGIN
|
|||||||
escape_varchar2_buffer_for_csv;
|
escape_varchar2_buffer_for_csv;
|
||||||
util_clob_append(v_buffer_varchar2);
|
util_clob_append(v_buffer_varchar2);
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
util_clob_append(v_line_terminator);
|
util_clob_append(v_line_terminator);
|
||||||
|
|
||||||
-- create data
|
-- create data
|
||||||
LOOP
|
LOOP
|
||||||
EXIT WHEN dbms_sql.fetch_rows(v_cursor) = 0 OR v_data_count = p_max_rows;
|
EXIT WHEN dbms_sql.fetch_rows(v_cursor) = 0 OR v_data_count = p_max_rows;
|
||||||
|
|
||||||
FOR i IN 1..v_col_cnt LOOP
|
FOR i IN 1..v_col_cnt LOOP
|
||||||
IF i > 1 THEN
|
IF i > 1 THEN
|
||||||
util_clob_append(p_delimiter);
|
util_clob_append(p_delimiter);
|
||||||
@ -980,54 +899,42 @@ BEGIN
|
|||||||
util_clob_append(v_buffer_varchar2);
|
util_clob_append(v_buffer_varchar2);
|
||||||
END IF;
|
END IF;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
util_clob_append(v_line_terminator);
|
util_clob_append(v_line_terminator);
|
||||||
v_data_count := v_data_count + 1;
|
v_data_count := v_data_count + 1;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
dbms_sql.close_cursor(v_cursor);
|
dbms_sql.close_cursor(v_cursor);
|
||||||
END IF;
|
END IF;
|
||||||
END util_clob_query_to_csv;
|
END util_clob_query_to_csv;
|
||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PROCEDURE util_clob_create_error_log (
|
PROCEDURE util_clob_create_error_log (p_export_files IN OUT NOCOPY tab_export_files) IS
|
||||||
p_export_files IN OUT NOCOPY tab_export_files
|
|
||||||
) IS
|
|
||||||
BEGIN
|
BEGIN
|
||||||
IF g_errlog.count > 0 THEN
|
IF g_errlog.count > 0 THEN
|
||||||
util_log_start(g_errlog.count || ' error' || CASE WHEN g_errlog.count != 1 THEN 's' END || ' occurred: create error log');
|
util_log_start(g_errlog.count || ' error' || CASE WHEN g_errlog.count != 1 THEN 's' END || ' occurred: create error log');
|
||||||
|
|
||||||
-- prepend header
|
|
||||||
util_clob_append(
|
util_clob_append(
|
||||||
replace('# {{MAIN_FUNCTION}} - Error Log', '{{MAIN_FUNCTION}}', upper(g_runlog.module))
|
replace('# {{MAIN_FUNCTION}} - Error Log', '{{MAIN_FUNCTION}}', upper(g_runlog.module))
|
||||||
|| c_crlf || c_crlf || c_crlf);
|
|| c_crlf || c_crlf || c_crlf);
|
||||||
|
|
||||||
FOR i IN 1..g_errlog.count LOOP
|
FOR i IN 1..g_errlog.count LOOP
|
||||||
util_clob_append('## ' || g_errlog(i).file_name || c_crlf || c_crlf);
|
util_clob_append('## ' || g_errlog(i).file_name || c_crlf || c_crlf);
|
||||||
util_clob_append(to_char(g_errlog(i).time_stamp, 'yyyy-mm-dd hh24:mi:ss.ffffff') || ': ' || g_errlog(i).error_text || c_crlf || c_crlf);
|
util_clob_append(to_char(g_errlog(i).time_stamp, 'yyyy-mm-dd hh24:mi:ss.ffffff') || ': ' || g_errlog(i).error_text || c_crlf || c_crlf);
|
||||||
util_clob_append('```sql' || c_crlf || g_errlog(i).call_stack || c_crlf || '```' || c_crlf || c_crlf || c_crlf);
|
util_clob_append('```sql' || c_crlf || g_errlog(i).call_stack || '```' || c_crlf || c_crlf || c_crlf);
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
-- add error log to file collection
|
|
||||||
util_clob_add_to_export_files(
|
util_clob_add_to_export_files(
|
||||||
p_export_files => p_export_files,
|
p_export_files => p_export_files,
|
||||||
p_name => 'plex_error_log.md');
|
p_name => 'plex_error_log.md');
|
||||||
|
|
||||||
util_log_stop;
|
util_log_stop;
|
||||||
END IF;
|
END IF;
|
||||||
END util_clob_create_error_log;
|
END util_clob_create_error_log;
|
||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PROCEDURE util_clob_create_runtime_log (
|
PROCEDURE util_clob_create_runtime_log (p_export_files IN OUT NOCOPY tab_export_files) IS
|
||||||
p_export_files IN OUT NOCOPY tab_export_files
|
|
||||||
) IS
|
|
||||||
BEGIN
|
BEGIN
|
||||||
util_log_calc_runtimes;
|
util_log_calc_runtimes;
|
||||||
util_clob_append(util_multi_replace('# {{MAIN_FUNCTION}} - Runtime Log
|
util_clob_append(util_multi_replace('# {{MAIN_FUNCTION}} - Runtime Log
|
||||||
|
|
||||||
- Export started at {{START_TIME}} and took {{RUN_TIME}} seconds to finish with {{ERRORCOUNT}} errors
|
- Export started at {{START_TIME}} and took {{RUN_TIME}} seconds to finish with {{ERRORS}}
|
||||||
- Unmeasured execution time because of system waits, missing log calls or log overhead was {{UNMEASURED_TIME}} seconds
|
- Unmeasured execution time because of system waits, missing log calls or log overhead was {{UNMEASURED_TIME}} seconds
|
||||||
- The used PLEX version was {{PLEX_VERSION}}
|
- The used PLEX version was {{PLEX_VERSION}}
|
||||||
- More infos here: [PLEX on GitHub]({{PLEX_URL}})
|
- More infos here: [PLEX on GitHub]({{PLEX_URL}})
|
||||||
@ -1039,14 +946,11 @@ BEGIN
|
|||||||
'{{UNMEASURED_TIME}}', trim(TO_CHAR(g_runlog.unmeasured_time, '999G990D000')),
|
'{{UNMEASURED_TIME}}', trim(TO_CHAR(g_runlog.unmeasured_time, '999G990D000')),
|
||||||
'{{PLEX_VERSION}}', c_plex_version,
|
'{{PLEX_VERSION}}', c_plex_version,
|
||||||
'{{PLEX_URL}}', c_plex_url,
|
'{{PLEX_URL}}', c_plex_url,
|
||||||
'{{ERRORCOUNT}}', g_errlog.count
|
'{{ERRORS}}', g_errlog.count || ' error' || CASE WHEN g_errlog.count != 1 THEN 's' END));
|
||||||
));
|
|
||||||
|
|
||||||
util_clob_append('
|
util_clob_append('
|
||||||
| Step | Elapsed | Execution | Action |
|
| Step | Elapsed | Execution | Action |
|
||||||
|------:|----------:|------------:|:-----------------------------------------------------------------|
|
|------:|----------:|------------:|:-----------------------------------------------------------------|
|
||||||
' );
|
' );
|
||||||
|
|
||||||
FOR i IN 1..g_runlog.data.count LOOP
|
FOR i IN 1..g_runlog.data.count LOOP
|
||||||
util_clob_append(util_multi_replace(
|
util_clob_append(util_multi_replace(
|
||||||
'| {{STEP}} | {{ELAPSED}} | {{EXECUTION}} | {{ACTION}} |' || c_lf,
|
'| {{STEP}} | {{ELAPSED}} | {{EXECUTION}} | {{ACTION}} |' || c_lf,
|
||||||
@ -1097,9 +1001,8 @@ FUNCTION backapp (
|
|||||||
p_include_error_log IN BOOLEAN DEFAULT true,
|
p_include_error_log IN BOOLEAN DEFAULT true,
|
||||||
p_base_path_backend IN VARCHAR2 DEFAULT 'app_backend',
|
p_base_path_backend IN VARCHAR2 DEFAULT 'app_backend',
|
||||||
p_base_path_frontend IN VARCHAR2 DEFAULT 'app_frontend',
|
p_base_path_frontend IN VARCHAR2 DEFAULT 'app_frontend',
|
||||||
p_base_path_data IN VARCHAR2 DEFAULT 'app_data'
|
p_base_path_data IN VARCHAR2 DEFAULT 'app_data')
|
||||||
) RETURN tab_export_files IS
|
RETURN tab_export_files IS
|
||||||
|
|
||||||
v_apex_version NUMBER;
|
v_apex_version NUMBER;
|
||||||
v_data_timestamp TIMESTAMP;
|
v_data_timestamp TIMESTAMP;
|
||||||
v_data_scn NUMBER;
|
v_data_scn NUMBER;
|
||||||
@ -1147,7 +1050,6 @@ FUNCTION backapp (
|
|||||||
v_app_alias;
|
v_app_alias;
|
||||||
CLOSE cur_owner;
|
CLOSE cur_owner;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
IF p_app_id IS NOT NULL AND v_app_owner IS NULL THEN
|
IF p_app_id IS NOT NULL AND v_app_owner IS NULL THEN
|
||||||
raise_application_error(
|
raise_application_error(
|
||||||
-20101,
|
-20101,
|
||||||
@ -1180,24 +1082,18 @@ FUNCTION backapp (
|
|||||||
p_with_no_subscriptions => CASE WHEN p_app_subscriptions THEN false ELSE true END,
|
p_with_no_subscriptions => CASE WHEN p_app_subscriptions THEN false ELSE true END,
|
||||||
p_with_comments => p_app_comments,
|
p_with_comments => p_app_comments,
|
||||||
p_with_supporting_objects => p_app_supporting_objects);
|
p_with_supporting_objects => p_app_supporting_objects);
|
||||||
|
|
||||||
FOR i IN 1..v_apex_files.count LOOP
|
FOR i IN 1..v_apex_files.count LOOP
|
||||||
v_export_files.extend;
|
v_export_files.extend;
|
||||||
|
|
||||||
-- relocate files to own project structure
|
-- relocate files to own project structure
|
||||||
v_export_files(i).name := replace(
|
v_export_files(i).name := replace(
|
||||||
v_apex_files(i).name,
|
v_apex_files(i).name,
|
||||||
'f' || p_app_id || '/application/',
|
'f' || p_app_id || '/application/',
|
||||||
p_base_path_frontend || '/');
|
p_base_path_frontend || '/');
|
||||||
|
|
||||||
-- correct prompts for relocation
|
-- correct prompts for relocation
|
||||||
v_export_files(i).contents := replace(
|
v_export_files(i).contents := replace(
|
||||||
v_apex_files(i).contents,
|
v_apex_files(i).contents,
|
||||||
'prompt --application/',
|
'prompt --application/',
|
||||||
'prompt --' || p_base_path_frontend || '/');
|
'prompt --' || p_base_path_frontend || '/');
|
||||||
|
|
||||||
v_apex_files.DELETE(i);
|
|
||||||
|
|
||||||
-- special handling for install file
|
-- special handling for install file
|
||||||
IF v_export_files(i).name = 'f' || p_app_id || '/install.sql' THEN
|
IF v_export_files(i).name = 'f' || p_app_id || '/install.sql' THEN
|
||||||
v_export_files(i).name := 'scripts/install_frontend_generated_by_apex.sql';
|
v_export_files(i).name := 'scripts/install_frontend_generated_by_apex.sql';
|
||||||
@ -1208,14 +1104,14 @@ FUNCTION backapp (
|
|||||||
'@application/', '@../' || p_base_path_frontend || '/',
|
'@application/', '@../' || p_base_path_frontend || '/',
|
||||||
'prompt --install', 'prompt --install_frontend_generated_by_apex');
|
'prompt --install', 'prompt --install_frontend_generated_by_apex');
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- handle build status RUN_ONLY
|
-- handle build status RUN_ONLY
|
||||||
IF v_export_files(i).name = p_base_path_frontend || '/create_application.sql' AND p_app_build_status_run_only THEN
|
IF v_export_files(i).name = p_base_path_frontend || '/create_application.sql' AND p_app_build_status_run_only THEN
|
||||||
v_export_files(i).contents := util_set_build_status_run_only(v_export_files(i).contents);
|
v_export_files(i).contents := util_set_build_status_run_only(v_export_files(i).contents);
|
||||||
END IF;
|
END IF;
|
||||||
|
v_apex_files.DELETE(i);
|
||||||
END LOOP;
|
END LOOP;
|
||||||
util_log_stop;
|
util_log_stop;
|
||||||
|
--
|
||||||
IF p_app_include_single_file THEN
|
IF p_app_include_single_file THEN
|
||||||
-- save as single file
|
-- save as single file
|
||||||
v_apex_files.DELETE;
|
v_apex_files.DELETE;
|
||||||
@ -1250,9 +1146,9 @@ FUNCTION backapp (
|
|||||||
p_like_list VARCHAR2,
|
p_like_list VARCHAR2,
|
||||||
p_not_like_list VARCHAR2,
|
p_not_like_list VARCHAR2,
|
||||||
p_placeholder_prefix VARCHAR2,
|
p_placeholder_prefix VARCHAR2,
|
||||||
p_column_name VARCHAR2
|
p_column_name VARCHAR2)
|
||||||
) IS
|
IS
|
||||||
v_expression_table tab_varchar2;
|
v_expression_table tab_vc32k;
|
||||||
BEGIN
|
BEGIN
|
||||||
-- process filter "like"
|
-- process filter "like"
|
||||||
v_expression_table := util_split(p_like_list, ',');
|
v_expression_table := util_split(p_like_list, ',');
|
||||||
@ -1266,7 +1162,6 @@ FUNCTION backapp (
|
|||||||
v_query,
|
v_query,
|
||||||
'#' || p_placeholder_prefix || '_LIKE_EXPRESSIONS#',
|
'#' || p_placeholder_prefix || '_LIKE_EXPRESSIONS#',
|
||||||
nvl(util_join(v_expression_table, ' or '), '1 = 1'));
|
nvl(util_join(v_expression_table, ' or '), '1 = 1'));
|
||||||
|
|
||||||
-- process filter "not like"
|
-- process filter "not like"
|
||||||
v_expression_table := util_split(p_not_like_list, ',');
|
v_expression_table := util_split(p_not_like_list, ',');
|
||||||
FOR i IN 1..v_expression_table.count LOOP
|
FOR i IN 1..v_expression_table.count LOOP
|
||||||
@ -1285,8 +1180,8 @@ FUNCTION backapp (
|
|||||||
END replace_query_like_expressions;
|
END replace_query_like_expressions;
|
||||||
|
|
||||||
PROCEDURE process_user_ddl IS
|
PROCEDURE process_user_ddl IS
|
||||||
BEGIN
|
|
||||||
-- user itself
|
PROCEDURE process_user IS
|
||||||
BEGIN
|
BEGIN
|
||||||
v_file_path := p_base_path_backend || '/_user/' || v_current_user || '.sql';
|
v_file_path := p_base_path_backend || '/_user/' || v_current_user || '.sql';
|
||||||
util_log_start(v_file_path);
|
util_log_start(v_file_path);
|
||||||
@ -1307,8 +1202,7 @@ END;
|
|||||||
^' ,
|
^' ,
|
||||||
'{{CURRENT_USER}}', v_current_user,
|
'{{CURRENT_USER}}', v_current_user,
|
||||||
'{{DDL}}', dbms_metadata.get_ddl('USER', v_current_user),
|
'{{DDL}}', dbms_metadata.get_ddl('USER', v_current_user),
|
||||||
'{{/}}', c_slash
|
'{{/}}', c_slash));
|
||||||
));
|
|
||||||
util_clob_add_to_export_files(
|
util_clob_add_to_export_files(
|
||||||
p_export_files => v_export_files,
|
p_export_files => v_export_files,
|
||||||
p_name => v_file_path);
|
p_name => v_file_path);
|
||||||
@ -1318,9 +1212,9 @@ END;
|
|||||||
WHEN OTHERS THEN
|
WHEN OTHERS THEN
|
||||||
util_setup_dbms_metadata;
|
util_setup_dbms_metadata;
|
||||||
util_log_error(v_file_path);
|
util_log_error(v_file_path);
|
||||||
END;
|
END process_user;
|
||||||
|
|
||||||
-- roles
|
PROCEDURE process_roles IS
|
||||||
BEGIN
|
BEGIN
|
||||||
v_file_path := p_base_path_backend || '/_user/' || v_current_user || '_roles.sql';
|
v_file_path := p_base_path_backend || '/_user/' || v_current_user || '_roles.sql';
|
||||||
util_log_start(v_file_path);
|
util_log_start(v_file_path);
|
||||||
@ -1336,9 +1230,9 @@ END;
|
|||||||
EXCEPTION
|
EXCEPTION
|
||||||
WHEN OTHERS THEN
|
WHEN OTHERS THEN
|
||||||
util_log_error(v_file_path);
|
util_log_error(v_file_path);
|
||||||
END;
|
END process_roles;
|
||||||
|
|
||||||
-- system privileges
|
PROCEDURE process_system_privileges IS
|
||||||
BEGIN
|
BEGIN
|
||||||
v_file_path := p_base_path_backend || '/_user/' || v_current_user || '_system_privileges.sql';
|
v_file_path := p_base_path_backend || '/_user/' || v_current_user || '_system_privileges.sql';
|
||||||
util_log_start(v_file_path);
|
util_log_start(v_file_path);
|
||||||
@ -1354,9 +1248,9 @@ END;
|
|||||||
EXCEPTION
|
EXCEPTION
|
||||||
WHEN OTHERS THEN
|
WHEN OTHERS THEN
|
||||||
util_log_error(v_file_path);
|
util_log_error(v_file_path);
|
||||||
END;
|
END process_system_privileges;
|
||||||
|
|
||||||
-- object privileges
|
PROCEDURE process_object_privileges IS
|
||||||
BEGIN
|
BEGIN
|
||||||
v_file_path := p_base_path_backend || '/_user/' || v_current_user || '_object_privileges.sql';
|
v_file_path := p_base_path_backend || '/_user/' || v_current_user || '_object_privileges.sql';
|
||||||
util_log_start(v_file_path);
|
util_log_start(v_file_path);
|
||||||
@ -1372,7 +1266,13 @@ END;
|
|||||||
EXCEPTION
|
EXCEPTION
|
||||||
WHEN OTHERS THEN
|
WHEN OTHERS THEN
|
||||||
util_log_error(v_file_path);
|
util_log_error(v_file_path);
|
||||||
END;
|
END process_object_privileges;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
process_user;
|
||||||
|
process_roles;
|
||||||
|
process_system_privileges;
|
||||||
|
process_object_privileges;
|
||||||
END process_user_ddl;
|
END process_user_ddl;
|
||||||
|
|
||||||
PROCEDURE process_object_ddl IS
|
PROCEDURE process_object_ddl IS
|
||||||
@ -1610,8 +1510,7 @@ ORDER BY
|
|||||||
util_clob_append(dbms_metadata.get_dependent_ddl(
|
util_clob_append(dbms_metadata.get_dependent_ddl(
|
||||||
'OBJECT_GRANT',
|
'OBJECT_GRANT',
|
||||||
v_rec.object_name,
|
v_rec.object_name,
|
||||||
v_rec.grantor
|
v_rec.grantor));
|
||||||
));
|
|
||||||
v_ddl_files.grants_(v_ddl_files.grants_.count + 1) := v_rec.file_path;
|
v_ddl_files.grants_(v_ddl_files.grants_.count + 1) := v_rec.file_path;
|
||||||
util_clob_add_to_export_files(
|
util_clob_add_to_export_files(
|
||||||
p_export_files => v_export_files,
|
p_export_files => v_export_files,
|
||||||
@ -1698,15 +1597,11 @@ END;
|
|||||||
END process_ref_constraints;
|
END process_ref_constraints;
|
||||||
|
|
||||||
PROCEDURE create_backend_install_file IS
|
PROCEDURE create_backend_install_file IS
|
||||||
FUNCTION get_script_line (
|
|
||||||
p_file_path VARCHAR2
|
FUNCTION get_script_line (p_file_path VARCHAR2) RETURN VARCHAR2 IS
|
||||||
) RETURN VARCHAR2 IS
|
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN 'prompt --' || replace(
|
RETURN 'prompt --' || replace(p_file_path, '.sql', NULL)
|
||||||
p_file_path,
|
|| c_lf || '@' || '../' || p_file_path || c_lf || c_lf;
|
||||||
'.sql',
|
|
||||||
NULL
|
|
||||||
) || c_lf || '@' || '../' || p_file_path || c_lf || c_lf;
|
|
||||||
END get_script_line;
|
END get_script_line;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
@ -1805,7 +1700,7 @@ SELECT table_name,
|
|||||||
p_column_name => 'table_name');
|
p_column_name => 'table_name');
|
||||||
OPEN v_cur FOR v_query;
|
OPEN v_cur FOR v_query;
|
||||||
util_log_stop;
|
util_log_stop;
|
||||||
|
--
|
||||||
util_log_start(p_base_path_data || '/get_scn');
|
util_log_start(p_base_path_data || '/get_scn');
|
||||||
v_data_timestamp := util_calc_data_timestamp(nvl(p_data_as_of_minutes_ago, 0));
|
v_data_timestamp := util_calc_data_timestamp(nvl(p_data_as_of_minutes_ago, 0));
|
||||||
v_data_scn := timestamp_to_scn(v_data_timestamp);
|
v_data_scn := timestamp_to_scn(v_data_timestamp);
|
||||||
@ -2030,8 +1925,8 @@ BEGIN
|
|||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
CREATE GLOBAL TEMPORARY TABLE temp_export_files (
|
CREATE GLOBAL TEMPORARY TABLE temp_export_files (
|
||||||
name VARCHAR2(255),
|
name VARCHAR2(255),
|
||||||
contents CLOB
|
contents CLOB)
|
||||||
) ON COMMIT DELETE ROWS
|
ON COMMIT DELETE ROWS
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
';
|
';
|
||||||
END LOOP;
|
END LOOP;
|
||||||
@ -2101,19 +1996,17 @@ set termout off serveroutput on
|
|||||||
spool "logs/temp_export_files.sql"
|
spool "logs/temp_export_files.sql"
|
||||||
BEGIN
|
BEGIN
|
||||||
-- create host commands for the needed directories (spool does not create missing directories)
|
-- create host commands for the needed directories (spool does not create missing directories)
|
||||||
FOR i IN (
|
FOR i IN (WITH t AS (SELECT regexp_substr(
|
||||||
WITH t AS (
|
name,
|
||||||
SELECT regexp_substr(name, '^((\w|\.)+\/)+' /*path without file name*/) AS dir
|
'^((\w|\.)+\/)+' /*path without file name*/) AS dir
|
||||||
FROM temp_export_files
|
FROM temp_export_files)
|
||||||
)
|
|
||||||
SELECT DISTINCT
|
SELECT DISTINCT
|
||||||
dir,
|
dir,
|
||||||
-- This is for Windows to create a directory and suppress warning if it exist.
|
-- This is for Windows to create a directory and suppress warning if it exist.
|
||||||
-- Align the command to your operating system:
|
-- Align the command to your operating system:
|
||||||
'host mkdir "' || replace(dir,'/','\') || '" 2>NUL' AS mkdir
|
'host mkdir "' || replace(dir,'/','\') || '" 2>NUL' AS mkdir
|
||||||
FROM t
|
FROM t
|
||||||
WHERE dir IS NOT NULL
|
WHERE dir IS NOT NULL) LOOP
|
||||||
) LOOP
|
|
||||||
dbms_output.put_line('set termout on');
|
dbms_output.put_line('set termout on');
|
||||||
dbms_output.put_line('spool "&logfile." append');
|
dbms_output.put_line('spool "&logfile." append');
|
||||||
dbms_output.put_line('prompt --create directory if not exist: ' || i.dir);
|
dbms_output.put_line('prompt --create directory if not exist: ' || i.dir);
|
||||||
@ -2122,7 +2015,6 @@ BEGIN
|
|||||||
dbms_output.put_line(i.mkdir);
|
dbms_output.put_line(i.mkdir);
|
||||||
dbms_output.put_line('-----');
|
dbms_output.put_line('-----');
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
-- create the spool calls for unload the files
|
-- create the spool calls for unload the files
|
||||||
FOR i IN (SELECT * FROM temp_export_files) LOOP
|
FOR i IN (SELECT * FROM temp_export_files) LOOP
|
||||||
dbms_output.put_line('set termout on');
|
dbms_output.put_line('set termout on');
|
||||||
@ -2135,7 +2027,6 @@ BEGIN
|
|||||||
dbms_output.put_line('spool off');
|
dbms_output.put_line('spool off');
|
||||||
dbms_output.put_line('-----');
|
dbms_output.put_line('-----');
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
END;
|
END;
|
||||||
{{/}}
|
{{/}}
|
||||||
spool off
|
spool off
|
||||||
@ -2149,6 +2040,7 @@ spool off
|
|||||||
set termout on serveroutput off
|
set termout on serveroutput off
|
||||||
spool "&logfile." append
|
spool "&logfile." append
|
||||||
|
|
||||||
|
|
||||||
prompt Delete files from the global temporary table
|
prompt Delete files from the global temporary table
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
@ -2169,7 +2061,7 @@ prompt
|
|||||||
p_export_files => v_export_files,
|
p_export_files => v_export_files,
|
||||||
p_name => v_file_path);
|
p_name => v_file_path);
|
||||||
util_log_stop;
|
util_log_stop;
|
||||||
|
--
|
||||||
v_file_template := q'^-- Template generated by PLEX version {{PLEX_VERSION}}
|
v_file_template := q'^-- Template generated by PLEX version {{PLEX_VERSION}}
|
||||||
-- More infos here: {{PLEX_URL}}
|
-- More infos here: {{PLEX_URL}}
|
||||||
|
|
||||||
@ -2197,11 +2089,9 @@ prompt Start Installation
|
|||||||
prompt =========================================================================
|
prompt =========================================================================
|
||||||
prompt Start backend installation
|
prompt Start backend installation
|
||||||
|
|
||||||
|
|
||||||
prompt Call PLEX backend install script
|
prompt Call PLEX backend install script
|
||||||
{{@}}install_backend_generated_by_plex.sql
|
{{@}}install_backend_generated_by_plex.sql
|
||||||
|
|
||||||
|
|
||||||
prompt Compile invalid objects
|
prompt Compile invalid objects
|
||||||
BEGIN
|
BEGIN
|
||||||
dbms_utility.compile_schema(
|
dbms_utility.compile_schema(
|
||||||
@ -2211,28 +2101,24 @@ BEGIN
|
|||||||
END;
|
END;
|
||||||
{{/}}
|
{{/}}
|
||||||
|
|
||||||
|
|
||||||
prompt Check invalid objects
|
prompt Check invalid objects
|
||||||
DECLARE
|
DECLARE
|
||||||
v_count PLS_INTEGER;
|
v_count PLS_INTEGER;
|
||||||
v_objects VARCHAR2(4000);
|
v_objects VARCHAR2(4000);
|
||||||
BEGIN
|
BEGIN
|
||||||
SELECT COUNT(*),
|
SELECT COUNT(*), chr(10) ||
|
||||||
listagg(object_name, ', ') within GROUP(ORDER BY object_name)
|
listagg('- ' || object_name || ' (' || object_type || ')', chr(10)) within GROUP(ORDER BY object_name)
|
||||||
INTO v_count,
|
INTO v_count, v_objects
|
||||||
v_objects
|
|
||||||
FROM user_objects
|
FROM user_objects
|
||||||
WHERE status = 'INVALID';
|
WHERE status = 'INVALID';
|
||||||
IF v_count > 0 THEN
|
IF v_count > 0 THEN
|
||||||
raise_application_error(-20000,
|
raise_application_error(-20000, chr(10) || chr(10) ||
|
||||||
'Found ' || v_count || ' invalid object'
|
'Found ' || v_count || ' invalid object' || CASE WHEN v_count > 1 THEN 's' END ||
|
||||||
|| CASE WHEN v_count > 1 THEN 's' END
|
' :-( ' || chr(10) || '=============================' || v_objects || chr(10) || chr(10) );
|
||||||
|| ' :-( ' || v_objects);
|
|
||||||
END IF;
|
END IF;
|
||||||
END;
|
END;
|
||||||
{{/}}
|
{{/}}
|
||||||
|
|
||||||
|
|
||||||
prompt Start frontend installation
|
prompt Start frontend installation
|
||||||
BEGIN
|
BEGIN
|
||||||
apex_application_install.set_workspace_id(APEX_UTIL.find_security_group_id(:app_workspace));
|
apex_application_install.set_workspace_id(APEX_UTIL.find_security_group_id(:app_workspace));
|
||||||
@ -2243,11 +2129,9 @@ BEGIN
|
|||||||
END;
|
END;
|
||||||
{{/}}
|
{{/}}
|
||||||
|
|
||||||
|
|
||||||
prompt Call APEX frontend install script
|
prompt Call APEX frontend install script
|
||||||
{{@}}install_frontend_generated_by_APEX.sql
|
{{@}}install_frontend_generated_by_APEX.sql
|
||||||
|
|
||||||
|
|
||||||
prompt =========================================================================
|
prompt =========================================================================
|
||||||
prompt Installation DONE :-)
|
prompt Installation DONE :-)
|
||||||
prompt
|
prompt
|
||||||
@ -2339,8 +2223,8 @@ END backapp;
|
|||||||
PROCEDURE add_query (
|
PROCEDURE add_query (
|
||||||
p_query VARCHAR2,
|
p_query VARCHAR2,
|
||||||
p_file_name VARCHAR2,
|
p_file_name VARCHAR2,
|
||||||
p_max_rows NUMBER DEFAULT 1000
|
p_max_rows NUMBER DEFAULT 1000)
|
||||||
) IS
|
IS
|
||||||
v_index PLS_INTEGER;
|
v_index PLS_INTEGER;
|
||||||
BEGIN
|
BEGIN
|
||||||
v_index := g_queries.count + 1;
|
v_index := g_queries.count + 1;
|
||||||
@ -2356,8 +2240,8 @@ FUNCTION queries_to_csv (
|
|||||||
p_quote_mark IN VARCHAR2 DEFAULT '"',
|
p_quote_mark IN VARCHAR2 DEFAULT '"',
|
||||||
p_header_prefix IN VARCHAR2 DEFAULT NULL,
|
p_header_prefix IN VARCHAR2 DEFAULT NULL,
|
||||||
p_include_runtime_log IN BOOLEAN DEFAULT true,
|
p_include_runtime_log IN BOOLEAN DEFAULT true,
|
||||||
p_include_error_log IN BOOLEAN DEFAULT true
|
p_include_error_log IN BOOLEAN DEFAULT true)
|
||||||
) RETURN tab_export_files IS
|
RETURN tab_export_files IS
|
||||||
v_export_files tab_export_files;
|
v_export_files tab_export_files;
|
||||||
|
|
||||||
PROCEDURE init IS
|
PROCEDURE init IS
|
||||||
@ -2419,9 +2303,7 @@ END queries_to_csv;
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
FUNCTION to_zip (
|
FUNCTION to_zip (p_file_collection IN tab_export_files) RETURN BLOB IS
|
||||||
p_file_collection IN tab_export_files
|
|
||||||
) RETURN BLOB IS
|
|
||||||
v_zip BLOB;
|
v_zip BLOB;
|
||||||
BEGIN
|
BEGIN
|
||||||
dbms_lob.createtemporary(v_zip, true);
|
dbms_lob.createtemporary(v_zip, true);
|
||||||
|
|||||||
132
PLEX.pks
132
PLEX.pks
@ -29,7 +29,7 @@ The package itself is independend, but functionality varies on the following con
|
|||||||
INSTALLATION
|
INSTALLATION
|
||||||
|
|
||||||
- Download the [latest version](https://github.com/ogobrecht/plex/releases/latest)
|
- Download the [latest version](https://github.com/ogobrecht/plex/releases/latest)
|
||||||
- Unzip it, open a shell and `cd` into the root directory
|
- Unzip it, open a shell and go into the root directory
|
||||||
- Start SQL*Plus (or another tool which can run SQL scripts)
|
- Start SQL*Plus (or another tool which can run SQL scripts)
|
||||||
- To install PLEX run the provided install script `plex_install.sql` (script provides compiler flags)
|
- To install PLEX run the provided install script `plex_install.sql` (script provides compiler flags)
|
||||||
- To uninstall PLEX run the provided script `plex_uninstall.sql` or drop the package manually
|
- To uninstall PLEX run the provided script `plex_uninstall.sql` or drop the package manually
|
||||||
@ -66,8 +66,7 @@ TYPE rec_error_log IS RECORD (
|
|||||||
time_stamp TIMESTAMP,
|
time_stamp TIMESTAMP,
|
||||||
file_name VARCHAR2(255),
|
file_name VARCHAR2(255),
|
||||||
error_text VARCHAR2(200),
|
error_text VARCHAR2(200),
|
||||||
call_stack VARCHAR2(500)
|
call_stack VARCHAR2(500));
|
||||||
);
|
|
||||||
TYPE tab_error_log IS TABLE OF rec_error_log;
|
TYPE tab_error_log IS TABLE OF rec_error_log;
|
||||||
|
|
||||||
TYPE rec_runtime_log IS RECORD (
|
TYPE rec_runtime_log IS RECORD (
|
||||||
@ -77,17 +76,16 @@ TYPE rec_runtime_log IS RECORD (
|
|||||||
elapsed NUMBER,
|
elapsed NUMBER,
|
||||||
execution NUMBER,
|
execution NUMBER,
|
||||||
module app_info_text,
|
module app_info_text,
|
||||||
action app_info_text
|
action app_info_text);
|
||||||
);
|
|
||||||
TYPE tab_runtime_log IS TABLE OF rec_runtime_log;
|
TYPE tab_runtime_log IS TABLE OF rec_runtime_log;
|
||||||
|
|
||||||
TYPE rec_export_file IS RECORD (
|
TYPE rec_export_file IS RECORD (
|
||||||
name VARCHAR2(255),
|
name VARCHAR2(255),
|
||||||
contents CLOB
|
contents CLOB);
|
||||||
);
|
|
||||||
TYPE tab_export_files IS TABLE OF rec_export_file;
|
TYPE tab_export_files IS TABLE OF rec_export_file;
|
||||||
|
|
||||||
TYPE tab_varchar2 IS TABLE OF varchar2(32767);
|
TYPE tab_vc32k IS TABLE OF varchar2(32767);
|
||||||
|
TYPE tab_vc1k IS TABLE OF VARCHAR2(1024) INDEX BY BINARY_INTEGER;
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
@ -129,8 +127,8 @@ $end
|
|||||||
p_include_error_log IN BOOLEAN DEFAULT true, -- If true, generate file plex_error_log.md with detailed error messages.
|
p_include_error_log IN BOOLEAN DEFAULT true, -- If true, generate file plex_error_log.md with detailed error messages.
|
||||||
p_base_path_backend IN VARCHAR2 DEFAULT 'app_backend', -- The base path in the project root for the database DDL files.
|
p_base_path_backend IN VARCHAR2 DEFAULT 'app_backend', -- The base path in the project root for the database DDL files.
|
||||||
p_base_path_frontend IN VARCHAR2 DEFAULT 'app_frontend', -- The base path in the project root for the APEX UI install files.
|
p_base_path_frontend IN VARCHAR2 DEFAULT 'app_frontend', -- The base path in the project root for the APEX UI install files.
|
||||||
p_base_path_data IN VARCHAR2 DEFAULT 'app_data' -- The base path in the project root for the data files.
|
p_base_path_data IN VARCHAR2 DEFAULT 'app_data') -- The base path in the project root for the data files.
|
||||||
) RETURN tab_export_files;
|
RETURN tab_export_files;
|
||||||
/**
|
/**
|
||||||
Get a file collection of an APEX application (or the current user/schema only) including:
|
Get a file collection of an APEX application (or the current user/schema only) including:
|
||||||
|
|
||||||
@ -170,7 +168,6 @@ BEGIN
|
|||||||
p_app_id => 100, -- parameter only available when APEX installed
|
p_app_id => 100, -- parameter only available when APEX installed
|
||||||
p_include_object_ddl => true,
|
p_include_object_ddl => true,
|
||||||
p_include_data => false));
|
p_include_data => false));
|
||||||
|
|
||||||
-- do something with the zip file
|
-- do something with the zip file
|
||||||
-- Your code here...
|
-- Your code here...
|
||||||
END;
|
END;
|
||||||
@ -231,8 +228,7 @@ SELECT backapp FROM dual;
|
|||||||
PROCEDURE add_query (
|
PROCEDURE add_query (
|
||||||
p_query IN VARCHAR2, -- The query itself
|
p_query IN VARCHAR2, -- The query itself
|
||||||
p_file_name IN VARCHAR2, -- File name like 'Path/to/your/file-without-extension'.
|
p_file_name IN VARCHAR2, -- File name like 'Path/to/your/file-without-extension'.
|
||||||
p_max_rows IN NUMBER DEFAULT 1000 -- The maximum number of rows to be included in your file.
|
p_max_rows IN NUMBER DEFAULT 1000); -- The maximum number of rows to be included in your file.
|
||||||
);
|
|
||||||
/**
|
/**
|
||||||
Add a query to be processed by the method queries_to_csv. You can add as many queries as you like.
|
Add a query to be processed by the method queries_to_csv. You can add as many queries as you like.
|
||||||
|
|
||||||
@ -255,8 +251,8 @@ FUNCTION queries_to_csv (
|
|||||||
p_quote_mark IN VARCHAR2 DEFAULT '"', -- Used when the data contains the delimiter character.
|
p_quote_mark IN VARCHAR2 DEFAULT '"', -- Used when the data contains the delimiter character.
|
||||||
p_header_prefix IN VARCHAR2 DEFAULT NULL, -- Prefix the header line with this text.
|
p_header_prefix IN VARCHAR2 DEFAULT NULL, -- Prefix the header line with this text.
|
||||||
p_include_runtime_log IN BOOLEAN DEFAULT true, -- If true, generate file plex_runtime_log.md with runtime statistics.
|
p_include_runtime_log IN BOOLEAN DEFAULT true, -- If true, generate file plex_runtime_log.md with runtime statistics.
|
||||||
p_include_error_log IN BOOLEAN DEFAULT true -- If true, generate file plex_error_log.md with detailed error messages.
|
p_include_error_log IN BOOLEAN DEFAULT true) -- If true, generate file plex_error_log.md with detailed error messages.
|
||||||
) RETURN tab_export_files;
|
RETURN tab_export_files;
|
||||||
/**
|
/**
|
||||||
Export one or more queries as CSV data within a file collection.
|
Export one or more queries as CSV data within a file collection.
|
||||||
|
|
||||||
@ -266,7 +262,6 @@ EXAMPLE BASIC USAGE
|
|||||||
DECLARE
|
DECLARE
|
||||||
l_file_collection plex.tab_export_files;
|
l_file_collection plex.tab_export_files;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
--fill the queries array
|
--fill the queries array
|
||||||
plex.add_query(
|
plex.add_query(
|
||||||
p_query => 'select * from user_tables',
|
p_query => 'select * from user_tables',
|
||||||
@ -275,10 +270,8 @@ BEGIN
|
|||||||
p_query => 'select * from user_tab_columns',
|
p_query => 'select * from user_tab_columns',
|
||||||
p_file_name => 'user_tab_columns',
|
p_file_name => 'user_tab_columns',
|
||||||
p_max_rows => 10000);
|
p_max_rows => 10000);
|
||||||
|
|
||||||
-- process the queries
|
-- process the queries
|
||||||
l_file_collection := plex.queries_to_csv;
|
l_file_collection := plex.queries_to_csv;
|
||||||
|
|
||||||
-- do something with the file collection
|
-- do something with the file collection
|
||||||
FOR i IN 1..l_file_collection.count LOOP
|
FOR i IN 1..l_file_collection.count LOOP
|
||||||
dbms_output.put_line(i || ' | '
|
dbms_output.put_line(i || ' | '
|
||||||
@ -295,7 +288,6 @@ EXPORT EXPORT ZIP FILE PL/SQL
|
|||||||
DECLARE
|
DECLARE
|
||||||
l_zip_file BLOB;
|
l_zip_file BLOB;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
--fill the queries array
|
--fill the queries array
|
||||||
plex.add_query(
|
plex.add_query(
|
||||||
p_query => 'select * from user_tables',
|
p_query => 'select * from user_tables',
|
||||||
@ -304,10 +296,8 @@ BEGIN
|
|||||||
p_query => 'select * from user_tab_columns',
|
p_query => 'select * from user_tab_columns',
|
||||||
p_file_name => 'user_tab_columns',
|
p_file_name => 'user_tab_columns',
|
||||||
p_max_rows => 10000);
|
p_max_rows => 10000);
|
||||||
|
|
||||||
-- process the queries
|
-- process the queries
|
||||||
l_zip_file := plex.to_zip(plex.queries_to_csv);
|
l_zip_file := plex.to_zip(plex.queries_to_csv);
|
||||||
|
|
||||||
-- do something with the zip file
|
-- do something with the zip file
|
||||||
-- Your code here...
|
-- Your code here...
|
||||||
END;
|
END;
|
||||||
@ -338,8 +328,8 @@ SELECT queries_to_csv_zip FROM dual;
|
|||||||
|
|
||||||
|
|
||||||
FUNCTION to_zip (
|
FUNCTION to_zip (
|
||||||
p_file_collection IN tab_export_files -- The file collection to zip.
|
p_file_collection IN tab_export_files) -- The file collection to zip.
|
||||||
) RETURN BLOB;
|
RETURN BLOB;
|
||||||
/**
|
/**
|
||||||
Convert a file collection to a zip file.
|
Convert a file collection to a zip file.
|
||||||
|
|
||||||
@ -352,7 +342,6 @@ BEGIN
|
|||||||
l_zip := plex.to_zip(plex.backapp(
|
l_zip := plex.to_zip(plex.backapp(
|
||||||
p_app_id => 100,
|
p_app_id => 100,
|
||||||
p_include_object_ddl => true));
|
p_include_object_ddl => true));
|
||||||
|
|
||||||
-- do something with the zip file...
|
-- do something with the zip file...
|
||||||
END;
|
END;
|
||||||
```
|
```
|
||||||
@ -387,28 +376,24 @@ SELECT * FROM TABLE(plex.view_runtime_log);
|
|||||||
|
|
||||||
$if $$utils_public $then
|
$if $$utils_public $then
|
||||||
|
|
||||||
FUNCTION util_bool_to_string (
|
FUNCTION util_bool_to_string (p_bool IN BOOLEAN) RETURN VARCHAR2;
|
||||||
p_bool IN BOOLEAN
|
|
||||||
) RETURN VARCHAR2;
|
|
||||||
|
|
||||||
FUNCTION util_string_to_bool (
|
FUNCTION util_string_to_bool (
|
||||||
p_bool_string IN VARCHAR2,
|
p_bool_string IN VARCHAR2,
|
||||||
p_default IN BOOLEAN
|
p_default IN BOOLEAN)
|
||||||
) RETURN BOOLEAN;
|
RETURN BOOLEAN;
|
||||||
|
|
||||||
FUNCTION util_split (
|
FUNCTION util_split (
|
||||||
p_string IN VARCHAR2,
|
p_string IN VARCHAR2,
|
||||||
p_delimiter IN VARCHAR2 DEFAULT ','
|
p_delimiter IN VARCHAR2 DEFAULT ',')
|
||||||
) RETURN tab_varchar2;
|
RETURN tab_vc32k;
|
||||||
|
|
||||||
FUNCTION util_join (
|
FUNCTION util_join (
|
||||||
p_array IN tab_varchar2,
|
p_array IN tab_vc32k,
|
||||||
p_delimiter IN VARCHAR2 DEFAULT ','
|
p_delimiter IN VARCHAR2 DEFAULT ',')
|
||||||
) RETURN VARCHAR2;
|
RETURN VARCHAR2;
|
||||||
|
|
||||||
FUNCTION util_clob_to_blob (
|
FUNCTION util_clob_to_blob (p_clob CLOB) RETURN BLOB;
|
||||||
p_clob CLOB
|
|
||||||
) RETURN BLOB;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZIP UTILS
|
ZIP UTILS
|
||||||
@ -421,20 +406,18 @@ ZIP UTILS
|
|||||||
FUNCTION util_zip_blob_to_num (
|
FUNCTION util_zip_blob_to_num (
|
||||||
p_blob IN BLOB,
|
p_blob IN BLOB,
|
||||||
p_len IN INTEGER,
|
p_len IN INTEGER,
|
||||||
p_pos IN INTEGER
|
p_pos IN INTEGER)
|
||||||
) RETURN NUMBER;
|
RETURN NUMBER;
|
||||||
FUNCTION util_zip_little_endian (
|
FUNCTION util_zip_little_endian (
|
||||||
p_big IN NUMBER,
|
p_big IN NUMBER,
|
||||||
p_bytes IN PLS_INTEGER := 4
|
p_bytes IN PLS_INTEGER := 4)
|
||||||
) RETURN RAW;
|
RETURN RAW;
|
||||||
PROCEDURE util_zip_add_file (
|
PROCEDURE util_zip_add_file (
|
||||||
p_zipped_blob IN OUT BLOB,
|
p_zipped_blob IN OUT BLOB,
|
||||||
p_name IN VARCHAR2,
|
p_name IN VARCHAR2,
|
||||||
p_content IN BLOB
|
p_content IN BLOB);
|
||||||
);
|
|
||||||
PROCEDURE util_zip_finish (
|
PROCEDURE util_zip_finish (p_zipped_blob IN OUT BLOB);
|
||||||
p_zipped_blob IN OUT BLOB
|
|
||||||
);
|
|
||||||
|
|
||||||
FUNCTION util_multi_replace (
|
FUNCTION util_multi_replace (
|
||||||
p_source_string VARCHAR2,
|
p_source_string VARCHAR2,
|
||||||
@ -449,16 +432,12 @@ FUNCTION util_multi_replace (
|
|||||||
p_09_find VARCHAR2 DEFAULT NULL, p_09_replace VARCHAR2 DEFAULT NULL,
|
p_09_find VARCHAR2 DEFAULT NULL, p_09_replace VARCHAR2 DEFAULT NULL,
|
||||||
p_10_find VARCHAR2 DEFAULT NULL, p_10_replace VARCHAR2 DEFAULT NULL,
|
p_10_find VARCHAR2 DEFAULT NULL, p_10_replace VARCHAR2 DEFAULT NULL,
|
||||||
p_11_find VARCHAR2 DEFAULT NULL, p_11_replace VARCHAR2 DEFAULT NULL,
|
p_11_find VARCHAR2 DEFAULT NULL, p_11_replace VARCHAR2 DEFAULT NULL,
|
||||||
p_12_find VARCHAR2 DEFAULT NULL, p_12_replace VARCHAR2 DEFAULT NULL
|
p_12_find VARCHAR2 DEFAULT NULL, p_12_replace VARCHAR2 DEFAULT NULL)
|
||||||
) RETURN VARCHAR2;
|
RETURN VARCHAR2;
|
||||||
|
|
||||||
FUNCTION util_set_build_status_run_only (
|
FUNCTION util_set_build_status_run_only (p_app_export_sql IN CLOB) RETURN CLOB;
|
||||||
p_app_export_sql IN CLOB
|
|
||||||
) RETURN CLOB;
|
|
||||||
|
|
||||||
FUNCTION util_calc_data_timestamp (
|
FUNCTION util_calc_data_timestamp (p_as_of_minutes_ago IN NUMBER) RETURN TIMESTAMP;
|
||||||
p_as_of_minutes_ago IN NUMBER
|
|
||||||
) RETURN TIMESTAMP;
|
|
||||||
|
|
||||||
PROCEDURE util_setup_dbms_metadata (
|
PROCEDURE util_setup_dbms_metadata (
|
||||||
p_pretty IN BOOLEAN DEFAULT true,
|
p_pretty IN BOOLEAN DEFAULT true,
|
||||||
@ -470,68 +449,49 @@ PROCEDURE util_setup_dbms_metadata (
|
|||||||
p_segment_attributes IN BOOLEAN DEFAULT false,
|
p_segment_attributes IN BOOLEAN DEFAULT false,
|
||||||
p_sqlterminator IN BOOLEAN DEFAULT true,
|
p_sqlterminator IN BOOLEAN DEFAULT true,
|
||||||
p_constraints_as_alter IN BOOLEAN DEFAULT false,
|
p_constraints_as_alter IN BOOLEAN DEFAULT false,
|
||||||
p_emit_schema IN BOOLEAN DEFAULT false
|
p_emit_schema IN BOOLEAN DEFAULT false);
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_ensure_unique_file_names (
|
PROCEDURE util_ensure_unique_file_names (p_export_files IN OUT tab_export_files);
|
||||||
p_export_files IN OUT tab_export_files
|
|
||||||
);
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- The following tools are working on global private package variables
|
-- The following tools are working on global private package variables
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
PROCEDURE util_log_init (
|
PROCEDURE util_log_init (p_module IN VARCHAR2);
|
||||||
p_module IN VARCHAR2
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_log_start (
|
PROCEDURE util_log_start (p_action IN VARCHAR2);
|
||||||
p_action IN VARCHAR2
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_log_error (
|
PROCEDURE util_log_error (p_name VARCHAR2);
|
||||||
p_name VARCHAR2
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_log_stop;
|
PROCEDURE util_log_stop;
|
||||||
|
|
||||||
FUNCTION util_log_get_runtime (
|
FUNCTION util_log_get_runtime (
|
||||||
p_start IN TIMESTAMP,
|
p_start IN TIMESTAMP,
|
||||||
p_stop IN TIMESTAMP
|
p_stop IN TIMESTAMP)
|
||||||
) RETURN NUMBER;
|
RETURN NUMBER;
|
||||||
|
|
||||||
PROCEDURE util_log_calc_runtimes;
|
PROCEDURE util_log_calc_runtimes;
|
||||||
|
|
||||||
PROCEDURE util_clob_append (
|
PROCEDURE util_clob_append (p_content IN VARCHAR2);
|
||||||
p_content IN VARCHAR2
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_clob_append (
|
PROCEDURE util_clob_append (p_content IN CLOB);
|
||||||
p_content IN CLOB
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_clob_flush_cache;
|
PROCEDURE util_clob_flush_cache;
|
||||||
|
|
||||||
PROCEDURE util_clob_add_to_export_files (
|
PROCEDURE util_clob_add_to_export_files (
|
||||||
p_export_files IN OUT NOCOPY tab_export_files,
|
p_export_files IN OUT NOCOPY tab_export_files,
|
||||||
p_name IN VARCHAR2
|
p_name IN VARCHAR2);
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_clob_query_to_csv (
|
PROCEDURE util_clob_query_to_csv (
|
||||||
p_query IN VARCHAR2,
|
p_query IN VARCHAR2,
|
||||||
p_max_rows IN NUMBER DEFAULT 1000,
|
p_max_rows IN NUMBER DEFAULT 1000,
|
||||||
p_delimiter IN VARCHAR2 DEFAULT ',',
|
p_delimiter IN VARCHAR2 DEFAULT ',',
|
||||||
p_quote_mark IN VARCHAR2 DEFAULT '"',
|
p_quote_mark IN VARCHAR2 DEFAULT '"',
|
||||||
p_header_prefix IN VARCHAR2 DEFAULT NULL
|
p_header_prefix IN VARCHAR2 DEFAULT NULL);
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_clob_create_error_log (
|
PROCEDURE util_clob_create_error_log (p_export_files IN OUT NOCOPY tab_export_files);
|
||||||
p_export_files IN OUT NOCOPY tab_export_files
|
|
||||||
);
|
|
||||||
|
|
||||||
PROCEDURE util_clob_create_runtime_log (
|
PROCEDURE util_clob_create_runtime_log (p_export_files IN OUT NOCOPY tab_export_files);
|
||||||
p_export_files IN OUT NOCOPY tab_export_files
|
|
||||||
);
|
|
||||||
|
|
||||||
$end
|
$end
|
||||||
|
|
||||||
|
|||||||
25
README.md
25
README.md
@ -36,7 +36,7 @@ The package itself is independend, but functionality varies on the following con
|
|||||||
INSTALLATION
|
INSTALLATION
|
||||||
|
|
||||||
- Download the [latest version](https://github.com/ogobrecht/plex/releases/latest)
|
- Download the [latest version](https://github.com/ogobrecht/plex/releases/latest)
|
||||||
- Unzip it, open a shell and `cd` into the root directory
|
- Unzip it, open a shell and go into the root directory
|
||||||
- Start SQL*Plus (or another tool which can run SQL scripts)
|
- Start SQL*Plus (or another tool which can run SQL scripts)
|
||||||
- To install PLEX run the provided install script `plex_install.sql` (script provides compiler flags)
|
- To install PLEX run the provided install script `plex_install.sql` (script provides compiler flags)
|
||||||
- To uninstall PLEX run the provided script `plex_uninstall.sql` or drop the package manually
|
- To uninstall PLEX run the provided script `plex_uninstall.sql` or drop the package manually
|
||||||
@ -114,7 +114,6 @@ BEGIN
|
|||||||
p_app_id => 100, -- parameter only available when APEX installed
|
p_app_id => 100, -- parameter only available when APEX installed
|
||||||
p_include_object_ddl => true,
|
p_include_object_ddl => true,
|
||||||
p_include_data => false));
|
p_include_data => false));
|
||||||
|
|
||||||
-- do something with the zip file
|
-- do something with the zip file
|
||||||
-- Your code here...
|
-- Your code here...
|
||||||
END;
|
END;
|
||||||
@ -207,8 +206,8 @@ $end
|
|||||||
p_include_error_log IN BOOLEAN DEFAULT true, -- If true, generate file plex_error_log.md with detailed error messages.
|
p_include_error_log IN BOOLEAN DEFAULT true, -- If true, generate file plex_error_log.md with detailed error messages.
|
||||||
p_base_path_backend IN VARCHAR2 DEFAULT 'app_backend', -- The base path in the project root for the database DDL files.
|
p_base_path_backend IN VARCHAR2 DEFAULT 'app_backend', -- The base path in the project root for the database DDL files.
|
||||||
p_base_path_frontend IN VARCHAR2 DEFAULT 'app_frontend', -- The base path in the project root for the APEX UI install files.
|
p_base_path_frontend IN VARCHAR2 DEFAULT 'app_frontend', -- The base path in the project root for the APEX UI install files.
|
||||||
p_base_path_data IN VARCHAR2 DEFAULT 'app_data' -- The base path in the project root for the data files.
|
p_base_path_data IN VARCHAR2 DEFAULT 'app_data') -- The base path in the project root for the data files.
|
||||||
) RETURN tab_export_files;
|
RETURN tab_export_files;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@ -234,8 +233,7 @@ SIGNATURE
|
|||||||
PROCEDURE add_query (
|
PROCEDURE add_query (
|
||||||
p_query IN VARCHAR2, -- The query itself
|
p_query IN VARCHAR2, -- The query itself
|
||||||
p_file_name IN VARCHAR2, -- File name like 'Path/to/your/file-without-extension'.
|
p_file_name IN VARCHAR2, -- File name like 'Path/to/your/file-without-extension'.
|
||||||
p_max_rows IN NUMBER DEFAULT 1000 -- The maximum number of rows to be included in your file.
|
p_max_rows IN NUMBER DEFAULT 1000); -- The maximum number of rows to be included in your file.
|
||||||
);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@ -250,7 +248,6 @@ EXAMPLE BASIC USAGE
|
|||||||
DECLARE
|
DECLARE
|
||||||
l_file_collection plex.tab_export_files;
|
l_file_collection plex.tab_export_files;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
--fill the queries array
|
--fill the queries array
|
||||||
plex.add_query(
|
plex.add_query(
|
||||||
p_query => 'select * from user_tables',
|
p_query => 'select * from user_tables',
|
||||||
@ -259,10 +256,8 @@ BEGIN
|
|||||||
p_query => 'select * from user_tab_columns',
|
p_query => 'select * from user_tab_columns',
|
||||||
p_file_name => 'user_tab_columns',
|
p_file_name => 'user_tab_columns',
|
||||||
p_max_rows => 10000);
|
p_max_rows => 10000);
|
||||||
|
|
||||||
-- process the queries
|
-- process the queries
|
||||||
l_file_collection := plex.queries_to_csv;
|
l_file_collection := plex.queries_to_csv;
|
||||||
|
|
||||||
-- do something with the file collection
|
-- do something with the file collection
|
||||||
FOR i IN 1..l_file_collection.count LOOP
|
FOR i IN 1..l_file_collection.count LOOP
|
||||||
dbms_output.put_line(i || ' | '
|
dbms_output.put_line(i || ' | '
|
||||||
@ -279,7 +274,6 @@ EXPORT EXPORT ZIP FILE PL/SQL
|
|||||||
DECLARE
|
DECLARE
|
||||||
l_zip_file BLOB;
|
l_zip_file BLOB;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
--fill the queries array
|
--fill the queries array
|
||||||
plex.add_query(
|
plex.add_query(
|
||||||
p_query => 'select * from user_tables',
|
p_query => 'select * from user_tables',
|
||||||
@ -288,10 +282,8 @@ BEGIN
|
|||||||
p_query => 'select * from user_tab_columns',
|
p_query => 'select * from user_tab_columns',
|
||||||
p_file_name => 'user_tab_columns',
|
p_file_name => 'user_tab_columns',
|
||||||
p_max_rows => 10000);
|
p_max_rows => 10000);
|
||||||
|
|
||||||
-- process the queries
|
-- process the queries
|
||||||
l_zip_file := plex.to_zip(plex.queries_to_csv);
|
l_zip_file := plex.to_zip(plex.queries_to_csv);
|
||||||
|
|
||||||
-- do something with the zip file
|
-- do something with the zip file
|
||||||
-- Your code here...
|
-- Your code here...
|
||||||
END;
|
END;
|
||||||
@ -326,8 +318,8 @@ FUNCTION queries_to_csv (
|
|||||||
p_quote_mark IN VARCHAR2 DEFAULT '"', -- Used when the data contains the delimiter character.
|
p_quote_mark IN VARCHAR2 DEFAULT '"', -- Used when the data contains the delimiter character.
|
||||||
p_header_prefix IN VARCHAR2 DEFAULT NULL, -- Prefix the header line with this text.
|
p_header_prefix IN VARCHAR2 DEFAULT NULL, -- Prefix the header line with this text.
|
||||||
p_include_runtime_log IN BOOLEAN DEFAULT true, -- If true, generate file plex_runtime_log.md with runtime statistics.
|
p_include_runtime_log IN BOOLEAN DEFAULT true, -- If true, generate file plex_runtime_log.md with runtime statistics.
|
||||||
p_include_error_log IN BOOLEAN DEFAULT true -- If true, generate file plex_error_log.md with detailed error messages.
|
p_include_error_log IN BOOLEAN DEFAULT true) -- If true, generate file plex_error_log.md with detailed error messages.
|
||||||
) RETURN tab_export_files;
|
RETURN tab_export_files;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@ -345,7 +337,6 @@ BEGIN
|
|||||||
l_zip := plex.to_zip(plex.backapp(
|
l_zip := plex.to_zip(plex.backapp(
|
||||||
p_app_id => 100,
|
p_app_id => 100,
|
||||||
p_include_object_ddl => true));
|
p_include_object_ddl => true));
|
||||||
|
|
||||||
-- do something with the zip file...
|
-- do something with the zip file...
|
||||||
END;
|
END;
|
||||||
```
|
```
|
||||||
@ -354,8 +345,8 @@ SIGNATURE
|
|||||||
|
|
||||||
```sql
|
```sql
|
||||||
FUNCTION to_zip (
|
FUNCTION to_zip (
|
||||||
p_file_collection IN tab_export_files -- The file collection to zip.
|
p_file_collection IN tab_export_files) -- The file collection to zip.
|
||||||
) RETURN BLOB;
|
RETURN BLOB;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,42 +0,0 @@
|
|||||||
<options><adjustCaseOnly>false</adjustCaseOnly>
|
|
||||||
<alignTabColAliases>true</alignTabColAliases>
|
|
||||||
<breakOnSubqueries>true</breakOnSubqueries>
|
|
||||||
<alignEquality>false</alignEquality>
|
|
||||||
<breakAfterElsif>false</breakAfterElsif>
|
|
||||||
<singleLineComments>oracle.dbtools.app.Format.InlineComments.CommentsUnchanged</singleLineComments>
|
|
||||||
<breakAnsiiJoin>false</breakAnsiiJoin>
|
|
||||||
<maxCharLineSize>128</maxCharLineSize>
|
|
||||||
<alignAssignments>true</alignAssignments>
|
|
||||||
<brkCtrIndentedConditionsActions>false</brkCtrIndentedConditionsActions>
|
|
||||||
<breaksProcArgs>true</breaksProcArgs>
|
|
||||||
<alignRight>true</alignRight>
|
|
||||||
<breaksComma>oracle.dbtools.app.Format.Breaks.After</breaksComma>
|
|
||||||
<breaksAroundLogicalConjunctions>oracle.dbtools.app.Format.Breaks.Before</breaksAroundLogicalConjunctions>
|
|
||||||
<breakAfterWhen>false</breakAfterWhen>
|
|
||||||
<brkCtrlIndentedActions>true</brkCtrlIndentedActions>
|
|
||||||
<alignNamedArgs>true</alignNamedArgs>
|
|
||||||
<formatProgramURL>default</formatProgramURL>
|
|
||||||
<formatThreshold>1</formatThreshold>
|
|
||||||
<spaceAroundOperators>true</spaceAroundOperators>
|
|
||||||
<useTab>false</useTab>
|
|
||||||
<idCase>oracle.dbtools.app.Format.Case.lower</idCase>
|
|
||||||
<extraLinesAfterSignificantStatements>oracle.dbtools.app.Format.BreaksX2.X2</extraLinesAfterSignificantStatements>
|
|
||||||
<breaksConcat>oracle.dbtools.app.Format.Breaks.None</breaksConcat>
|
|
||||||
<breakAfterIf>false</breakAfterIf>
|
|
||||||
<brkCtrlSeparateConditionsActions>false</brkCtrlSeparateConditionsActions>
|
|
||||||
<breakAfterElse>false</breakAfterElse>
|
|
||||||
<spaceAroundBrackets>oracle.dbtools.app.Format.Space.Default</spaceAroundBrackets>
|
|
||||||
<flowControl>oracle.dbtools.app.Format.FlowControl.IndentedActions</flowControl>
|
|
||||||
<commasPerLine>1</commasPerLine>
|
|
||||||
<brkCtrlTerse>false</brkCtrlTerse>
|
|
||||||
<forceLinebreaksBeforeComment>false</forceLinebreaksBeforeComment>
|
|
||||||
<breakAfterWhile>false</breakAfterWhile>
|
|
||||||
<alignTypeDecl>true</alignTypeDecl>
|
|
||||||
<breakParenCondition>false</breakParenCondition>
|
|
||||||
<identSpaces>2</identSpaces>
|
|
||||||
<breakAfterCase>false</breakAfterCase>
|
|
||||||
<breakAfterThen>false</breakAfterThen>
|
|
||||||
<breaksAfterSelect>false</breaksAfterSelect>
|
|
||||||
<spaceAfterCommas>true</spaceAfterCommas>
|
|
||||||
<kwCase>oracle.dbtools.app.Format.Case.UPPER</kwCase>
|
|
||||||
</options>
|
|
||||||
@ -10,30 +10,26 @@ DECLARE
|
|||||||
v_utils_public VARCHAR2(5) := 'FALSE'; -- Make utilities public available (for testing or other usages).
|
v_utils_public VARCHAR2(5) := 'FALSE'; -- Make utilities public available (for testing or other usages).
|
||||||
v_debug_on VARCHAR2(5) := 'FALSE'; -- Object DDL: extract only one object per type to find problematic ones and save time in big schemas like APEX_XXX.
|
v_debug_on VARCHAR2(5) := 'FALSE'; -- Object DDL: extract only one object per type to find problematic ones and save time in big schemas like APEX_XXX.
|
||||||
BEGIN
|
BEGIN
|
||||||
FOR i IN (
|
FOR i IN (SELECT *
|
||||||
SELECT *
|
|
||||||
FROM all_objects
|
FROM all_objects
|
||||||
WHERE object_type = 'SYNONYM'
|
WHERE object_type = 'SYNONYM'
|
||||||
AND object_name = 'APEX_EXPORT'
|
AND object_name = 'APEX_EXPORT') LOOP
|
||||||
) LOOP v_apex_installed := 'TRUE';
|
v_apex_installed := 'TRUE';
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
FOR i IN (SELECT *
|
||||||
FOR i IN (
|
|
||||||
SELECT *
|
|
||||||
FROM all_objects
|
FROM all_objects
|
||||||
WHERE object_type = 'SYNONYM'
|
WHERE object_type = 'SYNONYM'
|
||||||
AND object_name = 'ORDS_EXPORT'
|
AND object_name = 'ORDS_EXPORT') LOOP
|
||||||
) LOOP v_ords_installed := 'TRUE';
|
v_ords_installed := 'TRUE';
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
-- Show unset compiler flags as errors (results for example in errors like "PLW-06003: unknown inquiry directive '$$UTILS_PUBLIC'")
|
-- Show unset compiler flags as errors (results for example in errors like "PLW-06003: unknown inquiry directive '$$UTILS_PUBLIC'")
|
||||||
EXECUTE IMMEDIATE 'ALTER SESSION SET plsql_warnings = ''ENABLE:6003''';
|
EXECUTE IMMEDIATE 'ALTER SESSION SET plsql_warnings = ''ENABLE:6003''';
|
||||||
-- Finally set compiler flags
|
-- Finally set compiler flags
|
||||||
EXECUTE IMMEDIATE 'ALTER SESSION SET plsql_ccflags = ''' ||
|
EXECUTE IMMEDIATE 'ALTER SESSION SET plsql_ccflags = '''
|
||||||
'apex_installed:' || v_apex_installed || ',' ||
|
|| 'apex_installed:' || v_apex_installed || ','
|
||||||
'ords_installed:' || v_ords_installed || ',' ||
|
|| 'ords_installed:' || v_ords_installed || ','
|
||||||
'utils_public:' || v_utils_public || ',' ||
|
|| 'utils_public:' || v_utils_public || ','
|
||||||
'debug_on:' || v_debug_on || '''';
|
|| 'debug_on:' || v_debug_on || '''';
|
||||||
END;
|
END;
|
||||||
/
|
/
|
||||||
prompt Compile package plex (spec)
|
prompt Compile package plex (spec)
|
||||||
|
|||||||
@ -5,25 +5,23 @@ prompt Uninstalling PL/SQL Export Utilities
|
|||||||
prompt ====================================
|
prompt ====================================
|
||||||
prompt Drop package plex if exists (body)
|
prompt Drop package plex if exists (body)
|
||||||
BEGIN
|
BEGIN
|
||||||
FOR i IN (
|
FOR i IN (SELECT object_type,
|
||||||
SELECT object_type,
|
|
||||||
object_name
|
object_name
|
||||||
FROM user_objects
|
FROM user_objects
|
||||||
WHERE object_type = 'PACKAGE BODY'
|
WHERE object_type = 'PACKAGE BODY'
|
||||||
AND object_name = 'PLEX'
|
AND object_name = 'PLEX') LOOP
|
||||||
) LOOP EXECUTE IMMEDIATE 'DROP ' || i.object_type || ' ' || i.object_name;
|
EXECUTE IMMEDIATE 'DROP ' || i.object_type || ' ' || i.object_name;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
END;
|
END;
|
||||||
/
|
/
|
||||||
prompt Drop package plex if exists (spec)
|
prompt Drop package plex if exists (spec)
|
||||||
BEGIN
|
BEGIN
|
||||||
FOR i IN (
|
FOR i IN (SELECT object_type,
|
||||||
SELECT object_type,
|
|
||||||
object_name
|
object_name
|
||||||
FROM user_objects
|
FROM user_objects
|
||||||
WHERE object_type = 'PACKAGE'
|
WHERE object_type = 'PACKAGE'
|
||||||
AND object_name = 'PLEX'
|
AND object_name = 'PLEX') LOOP
|
||||||
) LOOP EXECUTE IMMEDIATE 'DROP ' || i.object_type || ' ' || i.object_name;
|
EXECUTE IMMEDIATE 'DROP ' || i.object_type || ' ' || i.object_name;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
END;
|
END;
|
||||||
/
|
/
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user