Color your SQL*Plus scripts!
You’re in a hurry and want to quick identify some hot spot in the output you got from your SQL*Plus script?
Color your SQL*Plus scripts!
Here is one dummy example of it:
create or replace package colors
is
function color(p_text in varchar2, p_fg_color in varchar2 default 'm', p_bg_color in varchar2 default '40m') return varchar2;
procedure colorize;
function red(p_text in varchar2) return varchar2;
function green(p_text in varchar2) return varchar2;
function blue(p_text in varchar2) return varchar2;
function yellow(p_text in varchar2) return varchar2;
function cyan(p_text in varchar2) return varchar2;
function pink(p_text in varchar2) return varchar2;
function black_on_white(p_text in varchar2) return varchar2;
function white_on_red(p_text in varchar2) return varchar2;
function white_on_green(p_text in varchar2) return varchar2;
function white_on_pink(p_text in varchar2) return varchar2;
function bold_black_on_white(p_text in varchar2) return varchar2;
function bold_white_on_red(p_text in varchar2) return varchar2;
function bold_white_on_green(p_text in varchar2) return varchar2;
function bold_white_on_pink(p_text in varchar2) return varchar2;
function bold_black_on_yellow(p_text in varchar2) return varchar2;
end;
/
create or replace package body colors
is
-- foreground colors
COLOR_BLACK CONSTANT VARCHAR2(5) := '30m';
COLOR_RED CONSTANT VARCHAR2(5) := '31m';
COLOR_GREEN CONSTANT VARCHAR2(5) := '32m';
COLOR_YELLOW CONSTANT VARCHAR2(5) := '33m';
COLOR_BLUE CONSTANT VARCHAR2(5) := '34m';
COLOR_PINK CONSTANT VARCHAR2(5) := '35m';
COLOR_CYAN CONSTANT VARCHAR2(5) := '36m';
COLOR_WHITE CONSTANT VARCHAR2(5) := '37m';
-- bold foreground colors
BOLD_COLOR_BLACK CONSTANT VARCHAR2(5) := '1;30m';
BOLD_COLOR_RED CONSTANT VARCHAR2(5) := '1;31m';
BOLD_COLOR_GREEN CONSTANT VARCHAR2(5) := '1;32m';
BOLD_COLOR_YELLOW CONSTANT VARCHAR2(5) := '1;33m';
BOLD_COLOR_BLUE CONSTANT VARCHAR2(5) := '1;34m';
BOLD_COLOR_PINK CONSTANT VARCHAR2(5) := '1;35m';
BOLD_COLOR_CYAN CONSTANT VARCHAR2(5) := '1;36m';
BOLD_COLOR_WHITE CONSTANT VARCHAR2(5) := '1;37m';
-- background colors
BG_COLOR_BLACK CONSTANT VARCHAR2(5) := '40m';
BG_COLOR_RED CONSTANT VARCHAR2(5) := '41m';
BG_COLOR_GREEN CONSTANT VARCHAR2(5) := '42m';
BG_COLOR_YELLOW CONSTANT VARCHAR2(5) := '43m';
BG_COLOR_BLU CONSTANT VARCHAR2(5) := '44m';
BG_COLOR_PINK CONSTANT VARCHAR2(5) := '45m';
BG_COLOR_CYAN CONSTANT VARCHAR2(5) := '46m';
BG_COLOR_WHITE CONSTANT VARCHAR2(5) := '47m';
function color(p_text in varchar2, p_fg_color in varchar2 default 'm', p_bg_color in varchar2 default '40m') return varchar2
is
begin
return chr(27)||'['|| p_fg_color ||chr(27)||'['|| p_bg_color || p_text ||chr(27)||'[0m';
-- chr(27)[ $FG chr(27) [ $BG p_text chr(27) [0m
-- http://www.pixelbeat.org/docs/terminal_colours/
end color;
procedure colorize
is
vPrintSQL VARCHAR2(32767) := '';
i pls_integer := 0;
begin
dbms_output.enable(100000);
for fg in (select distinct column_value as fg_color
from table(sys.odcivarchar2list ('m', '1m', '30m', '1;30m', '31m', '1;31m', '32m',
'1;32m', '33m', '1;33m', '34m', '1;34m', '35m', '1;35m',
'36m', '1;36m', '37m', '1;37m')) order by 1)
loop
for bg in (select distinct column_value as bg_color
from table(sys.odcivarchar2list ('40m','41m','42m','43m','44m','45m','46m','47m')) order by 1)
loop
vPrintSQL := vPrintSQL || '['|| chr(27)||'['|| fg.fg_color ||chr(27)||'['|| bg.bg_color || LPAD(fg.fg_color ||' + '|| bg.bg_color , 11, '.')||chr(27)||'[0m]';
if i = 7 then
dbms_output.put_line(vPrintSQL);
i := 0;
vPrintSQL := '';
else
i := i + 1;
end if;
end loop;
end loop;
end;
function red(p_text in varchar2) return varchar2
is
begin
return color(p_text, COLOR_RED);
end red;
function green(p_text in varchar2) return varchar2
is
begin
return color(p_text, COLOR_GREEN);
end green;
function blue(p_text in varchar2) return varchar2
is
begin
return color(p_text, COLOR_BLUE);
end blue;
function yellow(p_text in varchar2) return varchar2
is
begin
return color(p_text, COLOR_YELLOW);
end yellow;
function pink(p_text in varchar2) return varchar2
is
begin
return color(p_text, COLOR_PINK);
end pink;
function cyan(p_text in varchar2) return varchar2
is
begin
return color(p_text, COLOR_CYAN);
end cyan;
function black_on_white(p_text in varchar2) return varchar2
is
begin
return color(p_text, COLOR_BLACK, BG_COLOR_WHITE);
end;
function white_on_red(p_text in varchar2) return varchar2
is
begin
return color(p_text, COLOR_WHITE, BG_COLOR_RED);
end;
function white_on_green(p_text in varchar2) return varchar2
is
begin
return color(p_text, COLOR_WHITE, BG_COLOR_GREEN);
end;
function white_on_pink(p_text in varchar2) return varchar2
is
begin
return color(p_text, COLOR_WHITE, BG_COLOR_PINK);
end;
function bold_black_on_white(p_text in varchar2) return varchar2
is
begin
return color(p_text, BOLD_COLOR_BLACK, BG_COLOR_WHITE);
end;
function bold_white_on_red(p_text in varchar2) return varchar2
is
begin
return color(p_text, BOLD_COLOR_WHITE, BG_COLOR_RED);
end;
function bold_white_on_green(p_text in varchar2) return varchar2
is
begin
return color(p_text, BOLD_COLOR_WHITE, BG_COLOR_GREEN);
end;
function bold_white_on_pink(p_text in varchar2) return varchar2
is
begin
return color(p_text, BOLD_COLOR_WHITE, BG_COLOR_PINK);
end;
function bold_black_on_yellow(p_text in varchar2) return varchar2
is
begin
return color(p_text, BOLD_COLOR_BLACK, BG_COLOR_YELLOW);
end;
end colors;
/
Display free space percentage:
set linessize 300
set pages 200
col tablespace_name for a35
select round(used/1024/1024) as used_Mbytes, round(free/1024/1024) as free_mbytes, free_perc1 as free_pct,
case
when free_perc1 between 50 and 100 then colors.bold_white_on_green(tablespace_name)
when free_perc1 between 20 and 49 then colors.bold_black_on_yellow(tablespace_name)
when free_perc1 between 0 and 19 then colors.bold_white_on_red(tablespace_name)
end as tablespace_name
from (
select tablespace_name,
used, free,
round(free/used*100) as free_perc1
from (
select o1.tablespace_name,
(select sum(bytes) sumused from sys.dba_data_files s1 where s1.tablespace_name = o1.tablespace_name) as used,
(select sum(bytes) sumfree from sys.dba_free_space s2 where s2.tablespace_name = o1.tablespace_name) as free
from (select tablespace_name from sys.dba_tablespaces where contents = 'PERMANENT' ) o1
)
) o2
order by free_perc1 desc;
And here are all possible combinations of the foreground and background colors:
Please, feel free to use it! And don’t forget to send a screenshot of your colorful outputs! 😀
Don’t forget to set LINESIZE big enough!
And if you make any mistake and your putty background suddenly gets “colorized”, just type “tput sgr0” to bring it back to normal. 😉



1 thought on “Color your SQL*Plus scripts!”