Tipps & Tricks: Februar 2014 Bereich: SQL, DBA Erstellung: 02/2014 MP Versionsinfo: 12.1 Letzte Überarbeitung: 02/2014 MP SQL*Plus Hilfe erweitern 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)); Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 1 von 4 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>;'); Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 2 von 4 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||' ('|| Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 3 von 4 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. Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 4 von 4