CREATE OR REPLACE PACKAGE p AUTHID DEFINER
/* A replacement for DBMS_OUTPUT.PUT_LINE that offers
many overloadings and also needing to do nothing
more than type p.l */
IS
c_prefix CONSTANT CHAR (1) := CHR (8);
c_linelen CONSTANT INTEGER := 80;
/* Toggles output from p.l */
PROCEDURE turn_on;
PROCEDURE turn_off;
/* Specification of Set/Get for "linesep" */
PROCEDURE set_linesep (linesep_in IN VARCHAR2);
FUNCTION linesep
RETURN VARCHAR2;
/* Specification of Set/Get for "prefix" */
PROCEDURE set_prefix (prefix_in IN VARCHAR2 := c_prefix);
FUNCTION prefix
RETURN VARCHAR2;
/* Set line length before wrap */
PROCEDURE set_linelen (len IN INTEGER := c_linelen);
FUNCTION linelen
RETURN INTEGER;
/* The overloaded versions of the p.l procedure */
/* Display a date. Can specify a format mask or use the default. */
PROCEDURE l (dt IN DATE,
mask_in IN VARCHAR2 := NULL,
show_in IN BOOLEAN := FALSE);
/* Display a number. */
PROCEDURE l (num IN NUMBER, show_in IN BOOLEAN := FALSE);
/* Display a string. */
PROCEDURE l (stg IN VARCHAR2, show_in IN BOOLEAN := FALSE);
/* Display a string followed by a number. */
PROCEDURE l (stg IN VARCHAR2, num IN NUMBER, show_in IN BOOLEAN := FALSE);
/* Display a string followed by a date. */
PROCEDURE l (stg IN VARCHAR2,
dt IN DATE,
mask_in IN VARCHAR2 := NULL,
show_in IN BOOLEAN := FALSE);
/* Display a Boolean value. */
PROCEDURE l (bool IN BOOLEAN, show_in IN BOOLEAN := FALSE);
/* Display a string and then a Boolean value. */
PROCEDURE l (stg IN VARCHAR2,
bool IN BOOLEAN,
show_in IN BOOLEAN := FALSE);
/* Additional overloadings */
PROCEDURE l (num1 IN NUMBER, num2 IN NUMBER, show_in IN BOOLEAN := FALSE);
PROCEDURE l (str IN VARCHAR2,
num1 IN NUMBER,
num2 IN NUMBER,
show_in IN BOOLEAN := FALSE);
PROCEDURE l (bool1 IN BOOLEAN,
bool2 IN BOOLEAN,
show_in IN BOOLEAN := FALSE);
PROCEDURE l (stg1 IN VARCHAR2,
stg2 IN VARCHAR2,
show_in IN BOOLEAN := FALSE);
PROCEDURE l (dt1 IN DATE,
dt2 IN DATE,
mask_in IN VARCHAR2 := NULL,
show_in IN BOOLEAN := FALSE);
PROCEDURE l (num IN NUMBER,
dt IN DATE,
mask_in IN VARCHAR2 := NULL,
show_in IN BOOLEAN := FALSE);
PROCEDURE l (bool IN BOOLEAN, num IN NUMBER, show_in IN BOOLEAN := FALSE);
PROCEDURE l (bool IN BOOLEAN,
dt IN DATE,
mask_in IN VARCHAR2 := NULL,
show_in IN BOOLEAN := FALSE);
PROCEDURE l (bool IN BOOLEAN,
stg IN VARCHAR2,
show_in IN BOOLEAN := FALSE);
END p;
Package created.
CREATE OR REPLACE PACKAGE BODY p
IS
c_pkg CONSTANT CHAR (1) := 'p';
c_max_dopl_line INTEGER := 255;
c_delim CONSTANT CHAR (3) := ' - ';
/* Flag that determines whether output should be displayed. */
v_show BOOLEAN := TRUE;
g_showtime BOOLEAN := FALSE;
g_lasttime INTEGER := NULL;
/* Private Variable for "linesep" */
v_linesep VARCHAR2 (100) := NULL;
/* Private Variable for "prefix" */
v_prefix VARCHAR2 (100) := c_prefix;
v_prefix_len INTEGER := 1;
v_linelen INTEGER := c_linelen;
/*------------------- Private Modules -------------------*/
PROCEDURE put_line (stg_in IN VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.put_line (v_prefix || stg_in);
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.ENABLE (1000000);
DBMS_OUTPUT.put_line (v_prefix || stg_in);
END;
PROCEDURE display_line (show_in IN BOOLEAN, line_in IN VARCHAR2)
IS
BEGIN
IF v_show OR show_in
THEN
IF RTRIM (line_in) IS NULL
THEN
put_line ('');
ELSIF LTRIM (RTRIM (line_in)) = v_linesep
THEN
put_line ('');
ELSIF LENGTH (line_in) > linelen
THEN
put_line (SUBSTR (line_in, 1, linelen));
display_line (show_in
, SUBSTR (line_in, linelen + 1));
ELSE
put_line (line_in);
END IF;
END IF;
END;
/*--------------- Toggle Output Modules ---------------*/
PROCEDURE turn_on
IS
BEGIN
v_show := TRUE;
DBMS_OUTPUT.ENABLE (1000000);
END;
PROCEDURE turn_off
IS
BEGIN
v_show := FALSE;
END;
/* Body of Set for "linesep" */
PROCEDURE set_linesep (linesep_in IN VARCHAR2)
IS
BEGIN
v_linesep := linesep_in;
END set_linesep;
/* Body of Get for "linesep" */
FUNCTION linesep
RETURN VARCHAR2
IS
BEGIN
RETURN v_linesep;
END;
/* Body of Set for "prefix" */
PROCEDURE set_prefix (prefix_in IN VARCHAR2 := c_prefix)
IS
BEGIN
v_prefix := prefix_in;
v_prefix_len := LENGTH (prefix_in);
END set_prefix;
/* Body of Get for "prefix" */
FUNCTION prefix
RETURN VARCHAR2
IS
BEGIN
RETURN v_prefix;
END prefix;
/* Set line length before wrap */
PROCEDURE set_linelen (len IN INTEGER := c_linelen)
IS
BEGIN
v_linelen :=
LEAST (c_max_dopl_line
, GREATEST (NVL (len, c_linelen), 1)
);
END;
FUNCTION linelen
RETURN INTEGER
IS
BEGIN
RETURN v_linelen;
END;
/*------------------ The p.l Procedures ----------------*/
FUNCTION date_string (dt IN DATE, MASK IN VARCHAR2 := NULL)
RETURN VARCHAR2
IS
BEGIN
IF MASK IS NOT NULL
THEN
RETURN TO_CHAR (dt, MASK);
ELSE
RETURN TO_CHAR (dt);
END IF;
END;
FUNCTION bool_string (val IN boolean)
RETURN VARCHAR2
IS
BEGIN
IF val
THEN
RETURN 'TRUE';
ELSIF NOT val
THEN
RETURN 'FALSE';
ELSE
RETURN 'NULL';
END IF;
END;
PROCEDURE l (
dt IN DATE
, mask_in IN VARCHAR2 := NULL
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in, date_string (dt, mask_in));
END;
PROCEDURE l (num IN NUMBER, show_in IN BOOLEAN := FALSE)
IS
BEGIN
display_line (show_in, TO_CHAR (num));
END;
PROCEDURE l (stg IN VARCHAR2, show_in IN BOOLEAN := FALSE)
IS
BEGIN
display_line (show_in, stg);
END;
PROCEDURE l (
stg IN VARCHAR2
, num IN NUMBER
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in, stg || c_delim || TO_CHAR (num));
END;
PROCEDURE l (
stg IN VARCHAR2
, dt IN DATE
, mask_in IN VARCHAR2 := NULL
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in
, stg || c_delim || date_string (dt, mask_in)
);
END;
PROCEDURE l (bool IN BOOLEAN, show_in IN BOOLEAN := FALSE)
IS
BEGIN
display_line (show_in, bool_string (bool));
END;
PROCEDURE l (
stg IN VARCHAR2
, bool IN BOOLEAN
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in
, stg || c_delim || bool_string (bool)
);
END;
/* Additional overloadings */
PROCEDURE l (
num1 IN NUMBER
, num2 IN NUMBER
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in
, TO_CHAR (num1) || c_delim || TO_CHAR (num2)
);
END;
PROCEDURE l (
str IN VARCHAR2
, num1 IN NUMBER
, num2 IN NUMBER
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in
, str
|| c_delim
|| TO_CHAR (num1)
|| c_delim
|| TO_CHAR (num2)
);
END;
PROCEDURE l (
bool1 IN BOOLEAN
, bool2 IN BOOLEAN
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in
, bool_string (bool1)
|| c_delim
|| bool_string (bool2)
);
END;
PROCEDURE l (
stg1 IN VARCHAR2
, stg2 IN VARCHAR2
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in, stg1 || c_delim || stg2);
END;
PROCEDURE l (
dt1 IN DATE
, dt2 IN DATE
, mask_in IN VARCHAR2 := NULL
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in
, date_string (dt1, mask_in)
|| c_delim
|| date_string (dt2, mask_in)
);
END;
PROCEDURE l (
num IN NUMBER
, dt IN DATE
, mask_in IN VARCHAR2 := NULL
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in
, TO_CHAR (num)
|| c_delim
|| date_string (dt, mask_in)
);
END;
PROCEDURE l (
bool IN BOOLEAN
, num IN NUMBER
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in
, bool_string (bool) || c_delim
|| TO_CHAR (num)
);
END;
PROCEDURE l (
bool IN BOOLEAN
, dt IN DATE
, mask_in IN VARCHAR2 := NULL
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in
, bool_string (bool)
|| c_delim
|| date_string (dt, mask_in)
);
END;
PROCEDURE l (
bool IN BOOLEAN
, stg IN VARCHAR2
, show_in IN BOOLEAN := FALSE
)
IS
BEGIN
display_line (show_in
, stg || c_delim || bool_string (bool)
);
END;
/* Show time stamp toggle. Default is NOSHOW. */
PROCEDURE showtime
IS
BEGIN
g_showtime := TRUE;
g_lasttime := NULL;
END;
PROCEDURE noshowtime
IS
BEGIN
g_showtime := TRUE;
g_lasttime := NULL;
END;
FUNCTION showing_time
RETURN BOOLEAN
IS
BEGIN
RETURN g_showtime;
END;
END p;
Package Body created.
begin
p.l (100);
p.l ('abc');
p.l (sysdate);
p.l (sysdate, 'MM DD YYYY');
p.l (TRUE);
p.l (bool1 => TRUE, bool2 => FALSE);
p.l (100, sysdate);
p.l ('abc', sysdate);
end;
Statement processed.
100
abc
20-MAR-19
03 20 2019
TRUE
TRUE - FALSE
100 - 20-MAR-19
abc - 20-MAR-19