Afficher le résultat d'un "SELECT" verticalement.

C’est de loin le truc le plus cool de MySQL; le ego ou « G » : « Send command to mysql server, display result vertically. ». Je ne comprends pas qu’Oracle n’ai pas encore inclus la même fonctionnalité dans SQL*Plus; Enfin, pour pallier en partie à ce manque, voici printv; C’est moins facile à utiliser que le « G » mais ça permet lorsque vous faites une présentation d’avoir des écrans un peu mieux soignés; pour l’installer, lancez le script ci-dessous:

connect / as sysdba

create or replace procedure printv(
query varchar2)
authid current_user as
curid number;
ret number;
desctab dbms_sql.desc_tab;
colcnt number;
maxcoll number:=0;
namevar varchar2(80);
numvar number;
datevar date;
j number:=0;
begin
--
-- Display the Header
--
dbms_output.put_line('**** DISPLAY CONTENT OF ****'||
'****************************');
dbms_output.put_line('. '||query);
dbms_output.put_line('**** IS ********************'||
'****************************');
--
-- Prepare the Query
--
curid := dbms_sql.open_cursor;
dbms_sql.parse(curid, query,dbms_sql.native);
ret:=dbms_sql.execute(curid);
dbms_sql.describe_columns(curid, colcnt, desctab);
--
-- Get the size of the largest column
--
for i in 1..colcnt loop
maxcoll:=greatest(maxcoll,
length(desctab(i).col_name));
end loop;
--
-- Define column returned type
--
for i in 1..colcnt loop
if (desctab(i).col_type = 2) then
dbms_sql.define_column(curid, i, numvar);
elsif (desctab(i).col_type = 12) then
dbms_sql.define_column(curid, i, datevar);
else
dbms_sql.define_column(curid, i, namevar,80);
end if;
end loop;
--
-- Return all the rows
--
while dbms_sql.fetch_rows(curid) > 0 loop
j:=j+1;
dbms_output.put_line('**** ROW #'||rpad(to_char(j),7)
||' **********'||
'****************************');
for i in 1..colcnt loop
if (desctab(i).col_type = 1) then
dbms_sql.column_value(curid, i, namevar);
elsif (desctab(i).col_type = 2) then
dbms_sql.column_value(curid, i, numvar);
namevar:=to_char(numvar);
elsif (desctab(i).col_type = 12) then
dbms_sql.column_value(curid, i, datevar);
namevar:=to_char(datevar,
'DD-MON-YYYY HH24:MI:SS');
end if;
dbms_output.put_line(
rpad(desctab(i).col_name,maxcoll)||
' => '||namevar);
end loop;
end loop;

--
-- Close the Cursor and print the line
--
dbms_sql.close_cursor(curid);
dbms_output.put_line('**** END *******************'||
'****************************');
end;
/

create public synonym printv for sys.printv;
grant execute on sys.printv to dba;

Pour l’utiliser, si vous êtes DBA tapez quelque chose comme ceci:

set serveroutput on
exec printv('select * from dba_capture')

Le résultat sera un peu mieux léché:

 **** DISPLAY CONTENT OF ********************************
. select * from dba_capture
**** IS ************************************************
**** ROW #1 **************************************
CAPTURE_NAME => STREAMS_CAPTURE
QUEUE_NAME => STREAMS_QUEUE
QUEUE_OWNER => STRMADMIN
RULE_SET_NAME => RULESET$_9
RULE_SET_OWNER => STRMADMIN
CAPTURE_USER => STRMADMIN
START_SCN => 1010398
STATUS => ENABLED
CAPTURED_SCN => 2167433
APPLIED_SCN => 2167378
USE_DATABASE_LINK => NO
FIRST_SCN => 1010398
SOURCE_DATABASE => BLACK
SOURCE_DBID => 363224793
SOURCE_RESETLOGS_SCN => 1008631
SOURCE_RESETLOGS_TIME => 679061156
LOGMINER_ID => 21
NEGATIVE_RULE_SET_NAME =>
NEGATIVE_RULE_SET_OWNER =>
MAX_CHECKPOINT_SCN => 2167433
REQUIRED_CHECKPOINT_SCN => 2166351
LOGFILE_ASSIGNMENT => IMPLICIT
STATUS_CHANGE_TIME => 17-FEB-2009 12:16:03
ERROR_NUMBER =>
ERROR_MESSAGE =>
VERSION => 11.1.0.7.0
CAPTURE_TYPE => LOCAL
LAST_ENQUEUED_SCNc => 2167550
CHECKPOINT_RETENTION_TIME => 60
**** END ***********************************************

Pour l’instant, il ne gère pas les LOB, RAW ou autre mais nul doute que vous l’améliorerez facilement et qu’Oracle sortira quelque chose en 11g Release 2 (espérons!)

2 réflexions sur “Afficher le résultat d'un "SELECT" verticalement.”

Les commentaires sont fermés.