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-Training',1,'Schulung Tel.: 089 67909040') eintragen dann liefert der Befehl zurück:
SQL> help muniqsoft-training
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 warmwerden, tragen wir ein paar Texte ein (Ein bisschen Schleichwerbung muss schon sein :-) )
INSERT INTO system.help VALUES('MUNIQSOFT',0,'Muniqsoft GmbH www.muniqsoft-training.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 Oracle DBA, Administration, Migration,');
INSERT INTO system.help VALUES('MUNIQSOFT',3,'Schulungen (auch Inhouse), Tuning oder Backup + Recovery geht');
Und testen das mit:
help muniqsoft-training
Nun legen wir richtig los:
INSERT INTO system.help VALUES('ALTER DATABASE',0,'REM +++ Muniqsoft Training GmbH www.muniqsoft-training.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-training.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\O19C\SYSTEM01.DBF (700 MB)
SYSAUX 3 D:\ORACLE\ORADATA\O19C\SYSAUX01.DBF (650 MB)
UNDOTBS1 5 D:\ORACLE\ORADATA\O19C\UNDOTBS01.DBF (630 MB)
USERS 6 D:\ORACLE\ORADATA\O19C\USERS01.DBF (5 MB)
KUNDEN_TBS 12 D:\ORACLE\ORADATA\O19C\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.