SQL*Plus Funktionen mit 23ai

04.
November
2024
Veröffentlicht von: Cesar Orban

Mit 23ai hat Oracle SQL*Plus einige neue Features spendiert. Die Funktionen erstrecken sich über die Themenbereiche Fehlermeldungen, Netzwerk sowie Scripting. Es sollte also für jeden Anwender etwas Passendes dabei sein. ;-)

1. Fehlermeldungen

Bis Version 23ai bestanden Fehlermeldungen nur aus dem sogenannten Facility Name, z. B. ORA oder RMAN, dem dazugehörigen Error Code sowie einen mal mehr mal weniger aussagekräftigen Namen des Problems, sodass dies nicht gerade immer hilfreich war. Dieser Umstand hat den DBAs von Hochsicherheitsumgebung ohne Internetzugang bestimmt öfter einige Nerven geraubt. Ein Glück, dass Oracle mit dem neuen Release den Anwendern entgegenkommt.

HELP

Bei unbekannten Fehlermeldungen kann der HELP-Befehl neben seinen alten Funktionen jetzt auch helfen. Der Command gibt bei Angabe des Fehlercodes die URL inklusive des Inhalts der entsprechenden Seite im Oracle Help Center aus.

SQL> HELP ORA-01081
Message: "cannot start already-running ORACLE - shut it down first"
Help: docs.oracle.com/error-help/db/ora-01081/
Cause:     An attempt was made to start Oracle while it was
           already running.
Action:    Shut down Oracle first, if you want to restart it.


Folgende Schreibweisen sind ebenfalls gültig:

HELP ORA 01081

HELP 01081

Dieses Feature ist nicht nur mit ORA-Meldungen kompatibel, sondern kann auch für RMAN und weitere Fehlermeldungen genutzt werden.

SQL> HELP RMAN 6026
Message: "some targets not found - aborting restore"
Help: docs.oracle.com/error-help/db/rman-6026/
Cause: Some of the files specified for restore could not be found.
<…>


Wird jedoch der Facility Name ausgelassen, geht der Befehl davon aus, dass es sich um eine ORA-Meldung handelt.

SQL> HELP 06026
Message: "NETASY: port close failure"
Help: docs.oracle.com/error-help/db/ora-06026/
Cause: Async driver unable to close port
<…>


OERR

Anderes als HELP dient OERR exklusiv dem Zweck, den Inhalt des Oracle Help Center auszugeben.  

SQL> OERR ORA-01081
Message: "cannot start already-running ORACLE - shut it down first"
Help: docs.oracle.com/error-help/db/ora-01081/
<…>


OERR kann ebenfalls mit RMAN und sonstigen Error Meldungen umgehen und lässt folgende Schreibweisen zu:

OERR RMAN 06026

OERR RMAN06026

Bei OERR ist die Angabe des Facility Name zwingend notwendig.


ERRORDETAILS

Die Einstellung ERRORDETAILS ermöglicht es den Output bei Fehlermeldungen zu erweitern, wobei ON den Default-Wert darstellt.

 Option  Bedeutung
 OFF  Output wie in vorherigen Versionen
 ON  Link zum Artikel im „Oracle Help Center“ wird hinzugefügt
 VERBOSE  Link und Inhalt des Artikels wird hinzugefügt

 

 

 

 

SQL> show errordetails
errordetails ON
SQL> SELECT * FROM DUMMY;
SELECT * FROM DUMMY
              *
ERROR at line 1:
ORA-00942: table or view "SYS"."DUMMY" does not exist
Help: docs.oracle.com/error-help/db/ora-00942/
SQL> set errordetails off
SQL> SELECT * FROM DUMMY;
SELECT * FROM DUMMY
             *
ERROR at line 1:
ORA-00942: table or view "SYS"."DUMMY" does not exist
SQL> set errordetails verbose
SQL> SELECT * FROM DUMMY;
SELECT * FROM DUMMY
              *
ERROR at line 1:
ORA-00942: table or view "SYS"."DUMMY" does not exist
Help: docs.oracle.com/error-help/db/ora-00942/
Cause:     The specified table or view did not exist, or a synonym
           pointed to a table or view that did not exist.
           <…>

Action:    Check each of the following:
           - The spelling of the table or view name is correct.
           - The referenced table or view name does exist.
           - The synonym points to an existing table or view.
           <…>

Params: 1) object_name: The table or view name specified as
                        SCHEMA.OBJECT_NAME, if one is provided.
                        Otherwise, it is blank.


Um Konflikte mit älterer Software zu vermeiden, ist das Feature mittels der Umgebungsvariable ORA_SUPPRESS_ERROR_URL auf Betriebssystemebene deaktivierbar. Die Umgebungsvariable muss dazu auf den Wert TRUE gesetzt werden.

[oracle@tl017 ~]$ export ORA_SUPPRESS_ERROR_URL=TRUE
[oracle@tl017 ~]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems on Wed Oct 23 13:03:10 2024
Version 23.5.0.24.07

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.5.0.24.07

SQL> show errordetails
errordetails ON
SQL> select * from dummy;
select * from dummy
              *
ERROR at line 1:
ORA-00942: table or view "SYS"."DUMMY" does not exist

In der Praxis wird diese Funktion wahrscheinlich eher von Oracle "Neulingen" genutzt werden , da der zusätzliche Output alteingesessene Oracle Anwender wohl eher stört.


2. Netzwerk

Die Neuerungen im Bereich Netzwerk sparen dem Nutzer Zeit, da mehr Netzwerk-Informationen abgerufen werden können:

SHOW CONNECTION NETSERVICENAMES

Der Command SHOW CONNECTION NETSERVICENAMES gibt Informationen über die eingetragenen Services aus. Ohne die Angabe eines Servicenamen gibt der Befehl den Pfad zur TNSNAMES.ORA-Datei und sämtliche eingetragene Servicenamen aus.

SQL> SHOW CONNECTION NETSERVICENAMES
Local Net Naming configuration file: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
ORA-HOST-01_INST-01
FREE
LISTENER_FREE


Bei der Übergabe von einem oder mehreren Servicenamen an den Command, werden die dazugehörigen Einträge aufgelistet.

SQL> SHOW CONNECTION NETSERVICENAMES FREE ORA-HOST-01_INST-01
Local Net Naming configuration file: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
FREE = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(HOST = *********)) (CONNECT_DATA = <…>
ORA-HOST-01_INST-01 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = <…>

Der Befehl kann auf SHO CONN NETS gekürzt werden.

PING

Der PING-Command stellt eine in SQL*Plus integrierte Alternative zu TNSPING dar. Die Syntax des PING-Command ist Folgende:

PING [[LISTENER] <TNS-Alias>]

Bei einem Ping ohne Angabe eines TNS-Alias wird die Verbindung auf die Datenbank, an der man bereits angemeldet ist, geprüft.

[oracle@tl017 ~]$ sqlplus sys@ORA-HOST-01_INST-01 as sysdba 
<…>
Connected to an idle instance.
SQL> PING
Elapsed: -1622747:-33:-49.-79


Bei einem Ping mit Angabe eines TNS-Alias wird der Alias aufgelöst und der Ping auf dieses Ziel hin geprüft, dabei ist der Status des Listeners relevant.

SQL> PING ORA-HOST-01_INST-01
Local Net Naming configuration file: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
Attempting to contact: (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = *****)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = INST-01)))
Ok (2.258 msec
SQL> PING LISTENER ORA-HOST-01_INST-01
Local Net Naming configuration file: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
Attempting to contact: (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = *****)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = INST-01)))


Der Listener der entsprechenden DB wurde für folgenden Test heruntergefahren.

SQL> startup nomount
<…>
SQL> PING
OK (0.643 ms)
SQL> PING ORA-HOST-01_INST-01
Local Net Naming configuration file: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
Attempting to contact: (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = *****)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = INST-01)))
SP2-1683: Ping nicht erfolgreich, Fehler: TNS-12541.
Hilfe: docs.oracle.com/error-help/db/sp2-1683/
SQL> PING LISTENER ORA-HOST-01_INST-01
Local Net Naming configuration file: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
Attempting to contact: (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = *****)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = INST-01)))
SP2-1683: Ping nicht erfolgreich, Fehler: TNS-12541.
Hilfe: docs.oracle.com/error-help/db/sp2-1683/


Von der Shell des Betriebssystems ist ein Ping mittels des Parameters -p möglich.

[oracle@tl017 ~]$ sqlplus -p ORA-HOST-01_INST-01
Local Net Naming configuration file: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
Attempting to contact: (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = *****)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = INST-01)))
Ok (2.459 msec)


3. SCRIPTING

Für das SCRIPTING beschert Oracle SQL*PLUS den neuen Befehl ARGUMENT, der die Manipulation von fehlenden Skriptparametern erleichtert. Anhand der Position der Skriptparameter kann bestimmt werden, was mit diesen passieren soll, sofern kein Wert beim Skriptaufruf übergeben wird. Für die Parameter können entweder Default-Werte definiert und/oder der Nutzer zur Eingabe eines Wertes aufgefordert werden. Bei Nutzung von Nutzereingaben gilt wie immer in der IT: mögliche Injection Attacken vorab evaluieren.

OPTIONS

Der Befehl ARGUMENT stellt folgende Optionen zur Verfügung.

 Option  Bedeutung
 PROMPT  Aufforderung des Nutzers zu einer Eingabe
 HIDE  Zeigt die eigegebenen Zeichen nicht an
 DEFAULT  Definiert einen Default-Wert

 

 

 

 

 

Sollten die Optionen PROMPT und DEFAULT gemeinsam verwenden werden, greift der Default-Wert nur, wenn weder beim Skriptaufruf noch bei der Eingabeaufforderung ein Wert übergeben wird.

Skript-Beispiel

Im folgenden Skript werden zwei Skript-Parameter ausgegeben, für die der Nutzer Werte hinterlegen muss, sofern er diese beim Skriptaufruf auslässt. Der zweite Parameter wird mit der HIDE-Option gesammelt.

SET VERIFY OFF
ARGUMENT 1 PROMPT 'Enter your first argument: '
ARGUMENT 2 PROMPT 'Enter your second argument: ' HIDE
COL FIRST_ARGUMENT FORMAT A14
COL SECOND_ARGUMENT FORMAT A15
SELECT '&1' AS FIRST_ARGUMENT, '&2' AS SECOND_ARGUMENT;
undefine 1
undefine 2


Die Zeilen haben folgende Bedeutung:

 Zeile 1        Unterdrückt Output zur Initialisierung von Variablen
 Zeile 2-3  Der thematisierte Befehl
 Zeile 4-5  Output Formatierung
 Zeile 6  Der Output
 Zeile 7-8  Löschen der Variablen


Das Skript wurde einmal mit und einmal ohne Angabe von Werten beim Aufruf ausgeführt.

SQL> @/home/oracle/sql/test.sql 1 2

FIRST_ARGUMENT SECOND_ARGUMENT
-------------- ---------------
1              2

SQL> @/home/oracle/sql/test.sql
Enter your first argument: A
Enter your second argument:

FIRST_ARGUMENT SECOND_ARGUMENT
-------------- ---------------
A              B


Das Skript wird folgendermaßen angepasst:

  • Für den ersten Parameter wird der Nutzer weiterhin aufgefordert einen fehlenden Wert einzugeben, jedoch mit einem hinterlegten Default-Wert.
  • Für den zweiten Parameter wird nur ein Default-Wert hinterlegt.

SET VERIFY OFF
ARGUMENT 1 PROMPT 'Enter your first argument: ' DEFAULT 'A'
ARGUMENT 2 DEFAULT 'B'
COL FIRST_ARGUMENT FORMAT A14
COL SECOND_ARGUMENT FORMAT A15
SELECT '&1' AS FIRST_ARGUMENT, '&2' AS SECOND_ARGUMENT;
undefine 1
undefine 


Das Skript wurde einmal mit Werten aufgerufen, beim zweite Mal wurden keine Werte übergeben.

SQL> @/home/oracle/sql/test.sql 1 2

FIRST_ARGUMENT SECOND_ARGUMENT
-------------- ---------------
1              2

SQL> @/home/oracle/sql/test.sql
Enter your first argument:

FIRST_ARGUMENT SECOND_ARGUMENT
-------------- ---------------
A              B

 

Fazit

Die neuen Funktionen von SQL*Plus in der Oracle Version 23ai sparen den Anwendern einiges an Zeit und sind definitiv einen Blick wert.

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.