SQL*Plus Hilfe erweitern

25.
Januar
2014
Veröffentlicht von: Marco Patzwahl

Die SQL*Plus Hilfe war bis zur Version 8.1 eigentlich recht hilfreich, da sie bei der Syntax von SQL und PL/SQL immer recht gut weitergeholfen hat. Leider wird dieser Bereich von Oracle nicht mehr gepflegt, es wurde nur noch die SQL*Plus Syntax in der Hilfe gelassen. Es ist Zeit, hier etwas zu verbessern.

Die SQL*Plus Hilfe war bis zur Version 8.1 eigentlich recht hilfreich, da sie bei der Syntax von SQL und PL/SQL immer recht gut weitergeholfen hat. Leider wird dieser Bereich von Oracle nicht mehr gepflegt, es wurde nur noch die SQL*Plus Syntax in der Hilfe gelassen.

Es ist Zeit, hier etwas zu verbessern. Hinweis: Dies ist von Oracle nicht supported! und sollte deshalb nur auf Testdatenbanken verwendet werden.

Wenn die Hilfe-Tabelle noch nicht existiert, legen Sie diese bitte mit folgendem Skript an:

connect system/sys
@?/sqlplus/admin/help/hlpbld.sql helpus.sql

Dann schauen wir uns die Struktur der Tabelle einmal genauer an:

SQL> desc system.help
 Name    Null?    Typ
 ------ --------- ----------------
 TOPIC   NOT NULL VARCHAR2(50)
 SEQ     NOT NULL NUMBER
 INFO             VARCHAR2(80)

Die Topic-Spalte ist für den Text verantwortlich nach dem gesucht wird, die Info-Spalte gibt dann den Hilfetext zurück. Die SEQ-Spalte ist für mehrzeilige Texte gedacht. Sie muss pro Topic eindeutig sein.

Wenn wir in die Tabelle die Werte ('Muniqsoft',1,'Schulung Tel.: 089 67909040') eintragen dann liefert der Befehl zurück:

SQL> help muniqsoft
Schulung Tel.: 089 67909040

Hinweis:
Für einige Hilfetexte ist in den Spalten zu wenig Platz, deswegen vergrößern wir zwei Spalten. In der Version 12.1 hat das funktioniert. In älteren Versionen kann es zu Problemen kommen, dann lassen Sie den Schritt weg. Jedoch können Sie dann natürlich auch nicht so viel Text in die Spalten eintragen.

ALTER TABLE system.help MODIFY (info VARCHAR2(140));
ALTER TABLE system.help MODIFY (topic VARCHAR2(100));

Zum warm werden, tragen wir ein paar Texte ein (Ein bisschen Schleichwerbung muss schon sein :-) ):

INSERT INTO system.help VALUES('MUNIQSOFT',0,'Muniqsoft GmbH www.muniqsoft.de Tel.: 089/67 90 90 40');
INSERT INTO system.help VALUES('MUNIQSOFT',1,'Beratung, Schulungen, Consulting, Lizenzvertrieb');
INSERT INTO system.help VALUES('MUNIQSOFT',2,'Ihr Oracle Partner, wenn es um RAC, Administration, Migration,');
INSERT INTO system.help VALUES('MUNIQSOFT',3,'Schulungen (auch Inhouse), Tuning oder Backup + Recovery geht');

Und testen das mit:

help muniqsoft

Nun legen wir richtig los:

INSERT INTO system.help VALUES('ALTER DATABASE',0,'REM +++ Muniqsoft GmbH www.muniqsoft.de Tel.: 089/67909040 +++');
INSERT INTO system.help VALUES('ALTER DATABASE',1,'ALTER DATABASE DEFAULT TEMPORARY TABLESPACE <temp>;');
INSERT INTO system.help VALUES('ALTER DATABASE',2,'ALTER DATABASE DATAFILE ''<file>'' RESIZE <x>M;');

INSERT INTO system.help VALUES('ALTER DATABASE',3,'ALTER DATABASE ADD LOGFILE <name> SIZE <x>M;');
INSERT INTO system.help VALUES('ALTER DATABASE',4,'ALTER DATABASE DROP LOGFILE GROUP <n>;');
INSERT INTO system.help VALUES('ALTER DATABASE',5,'ALTER DATABASE DROP LOGFILE MEMBER ''<file>'';');

INSERT INTO system.help VALUES('ALTER DATABASE',10,'ALTER DATABASE RENAME GLOBAL_NAME TO <demo.world.muniqsoft.com>;');
INSERT INTO system.help VALUES('ALTER DATABASE',11,'ALTER DATABASE CHARACTER SET <charset>;');
INSERT INTO system.help VALUES('ALTER DATABASE',12,'ALTER DATABASE NATIONAL CHARACTER SET <charset>;');
INSERT INTO system.help VALUES('ALTER DATABASE',13,'ALTER DATABASE OPEN RESETLOGS;');

REM RECOVERY
INSERT INTO system.help VALUES('RECOVER',100,'REM +++ Muniqsoft GmbH www.muniqsoft.de Tel.: 089/67909040 +++');
INSERT INTO system.help VALUES('RECOVER',101,'RECOVER DATABASE [USING BACKUP CONTROLFILE];');
INSERT INTO system.help VALUES('RECOVER',102,'RECOVER DATABASE UNTIL CANCEL [USING BACKUP CONTROLFILE];');
INSERT INTO system.help VALUES('RECOVER',103,'RECOVER DATABASE UNTIL TIME ''YYYY-MM-DD:HH24:MI:SS''[USING BACKUP CONTROLFILE];');
INSERT INTO system.help VALUES('RECOVER',104,'RECOVER DATABASE UNTIL CHANGE <nr>;');

Wie wäre es mit allen undokumentierten Parametern mit Beschreibung (in zwei Zeilen wegen der Länge):

connect sys/<pwd>@db as sysdba

INSERT INTO system.help
SELECT  b.ksppinm ,1,b.ksppinm||'='||a.ksppstvl||' (Def:'||a.ksppstdf||')'
FROM sys.x$ksppi b, sys.x$ksppcv a
WHERE a.indx = b.indx
AND substr(b.ksppinm,1,1)='_';

INSERT INTO system.help
SELECT b.ksppinm,2,'Info: '||substr(b.ksppdesc,1,130)
FROM sys.x$ksppi b, sys.x$ksppcv a
WHERE a.indx = b.indx
AND substr(b.ksppinm,1,1)='_';

Aber es geht noch besser: Wenn wir dynamische Infos wie z. B. aus V$SESSION oder DBA_USER oder ... mit der Hilfe anzeigen wollen, dann verschieben Sie die Ursprungstabelle help in eine Tabelle help_tab und konsolidieren alle Informationen in einer View:

GRANT SELECT ON dba_users TO system;
GRANT SELECT ON dba_data_files TO system;
GRANT SELECT ON sys.v_$session TO system;
GRANT SELECT ON system.help TO <user>; -- Geben Sie den Benutzer an, der mit dem HELP Befehl arbeiten soll. Dieser muss dann auch auf die obigen Views Rechte bekommen.
ALTER TABLE SYSTEM.help RENAME TO help_tab;

CREATE OR REPLACE VIEW system.help
AS
SELECT * FROM system.help_tab
UNION ALL /* ++++ Benutzer ++++++ */
SELECT 'USERS',0,rpad('ID',3,' ')||' '||rpad('USER',25,' ')||rpad(' Account Status',19,' ')
||rpad('DEF TBS',27,' ')||rpad('TMP TBS',18,' ') FROM DUAL
UNION ALL
SELECT 'USERS',0,rpad('-',3,'-')||' '||rpad('-',25,'-')||' '||rpad('-',17,'-')||' '||
rpad('-',26,'-')||' '||rpad('-',18,'-') FROM DUAL
UNION ALL
select 'USERS',user_id+1,rpad(user_id,3,' ')||' '||rpad(username,25,' ')||' '||rpad(account_status,17,' ')||
rpad(default_tablespace,18,' ')||temporary_tablespace
from dba_users
UNION ALL /* +++++ Tablespace und deren Größe ++++++*/
SELECT 'TABLESPACES',0,rpad('TABLESPACE',22,' ')||' F_id Fileame (Groesse)' FROM DUAL
UNION ALL
SELECT 'TABLESPACES',0,rpad('-',22,'-')||' '||rpad('-',2,'-')||' '||rpad('-',62,'-') FROM DUAL
UNION ALL
SELECT 'TABLESPACES',file_id,rpad(tablespace_name,25,' ')||' '||file_id||' '||file_name||' ('||
round(bytes/1024/1024,2)||' MB)'  FROM dba_data_files
UNION ALL /* +++++++ Sessions +++++++++ */
SELECT 'SESSIONS',0,rpad('USER',12,' ')||' Status          SQLID            Last CALL        EVENT' FROM DUAL
UNION ALL
SELECT 'SESSIONS',0,rpad('-',12,'-')||' '||rpad('-',15,'-')||' '||rpad('-',15,'-')
||' '||rpad('-',16,'-')||' '||rpad('-',34,'-') FROM DUAL
UNION ALL
select 'SESSIONS',sid,rpad(username,12,' ')||' Status:'||rpad(status,8,' ')||' SQLID:'||rpad(nvl(sql_id,'-'),10,' ')
||' Last Call:'||rpad(last_call_et,6,' ')||' Event:'||event from v$session
where type='USER' and username is not null
;

Das testen wir z. B. mit:

SQL> help sessions
USER  Status          SQLID            Last CALL        EVENT
----- --------------- --------------- ---------------- ----------------------------------
SYS   Status:ACTIVE   SQLID:b9jqaugh1w Last Call:0      Event:SQL*Net message to client
SYS   Status:INACTIVE SQLID:-          Last Call:75900  Event:SQL*Net message from client

SQL> help users
ID  USER    Account Status    DEF TBS         TMP TBS
--- ------- ----------------- --------------- ---------
0   SYS     OPEN              SYSTEM          TEMP
7   AUDSYS  EXPIRED & LOCKED  USERS           TEMP
8   SYSTEM  EXPIRED(GRACE)    SYSTEM          TEMP
13  OUTLN   EXPIRED           SYSTEM          TEMP

SQL> help tablespaces
TABLESPACE   F_id Fileame (Groesse)
------------ -- -------------------------------------------------
SYSTEM          1 D:\ORACLE\ORADATA\O12C\SYSTEM01.DBF (700 MB)
SYSAUX          3 D:\ORACLE\ORADATA\O12C\SYSAUX01.DBF (650 MB)
UNDOTBS1        5 D:\ORACLE\ORADATA\O12C\UNDOTBS01.DBF (630 MB)
USERS           6 D:\ORACLE\ORADATA\O12C\USERS01.DBF (5 MB)
KUNDEN_TBS      12 D:\ORACLE\ORADATA\O12C\KUNDEN01.DBF (6144 MB)

Weitere Ideen zu diesem Thema lernen Sie in unserem SQL*Plus Tageskurs. Sie können das Konzept natürlich selbst nach Belieben erweitern, z. B. SQL Area Befehle anhand der SQL_ID ausgeben oder alle Locks anzeigen. Wenn Sie weitere Punkte integriert haben, schicken Sie sie uns doch bitte, dann machen wir nochmal einen Bonus Track zu diesem Tipp.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.