Im Gespräch mit einem Oracle Mitarbeiter letztes Jahr kam die Idee auf, warum Oracle keinen Select bietet, um den den Stand des Listeners abzufragen.
Der Mitarbeiter (nennen wir ihn mal Sebastian S. :-) ) wollte die Idee ins Development bringen. Bis das umgesetzt ist, helfen wir uns selbst:
Unter Linux legen wir uns eine kleine Shell Script Datei an
vi /home/oracle/scripts/lsnr_status.sh
#!/bin/bash
ORACLE_HOME=/opt/oracle/product/23c/dbhomeFree
$ORACLE_HOME/bin/lsnrctl status | /usr/bin/awk '
BEGIN { OFS=","; print "LINE"}
{ print $0 }'
Und geben dieser Datei Ausführungsrechte:
chmod +x /home/oracle/scripts/lsnr_status.sh
Dann brauchen wir ein Datenbank Directory auf diesen Ordner:
CREATE DIRECTORY ext_tab_dir AS '/home/oracle/scripts';
grant read,execute on directory ext_tab_dir to muniq;
Seit Version 19c kann eine External Table ohne ein Create direct “On the Fly” erzeugt werden:
SELECT * FROM EXTERNAL (
( line varchar2(2000))
TYPE oracle_loader
DEFAULT DIRECTORY ext_tab_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
PREPROCESSOR ext_tab_dir:'lsnr_status.sh'
FIELDS CSV WITH EMBEDDED TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL )
LOCATION ('lsnr_status.sh')
REJECT LIMIT UNLIMITED ) inline_ext_tab;
Bei älteren Versionen legt man halt zuesrt die Tabelle an:
CREATE TABLE ext_listener_status (
line VARCHAR2(4000)
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_tab_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
--PREPROCESSOR ext_tab_dir:'lsnr_status.sh'
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
( line )
)
LOCATION ('lsnr.info')
);
SELECT * FROM ext_listener_status;
Das war es schon, jetzt können Sie den Listener Zustand auch innerhalb der Datenbabnk abfragen (also via SQL*Plus, SQL cl, SQL Developer oder TOAD, oder …)