Come configurare il prompt di SQL*PLUS

Molto di ciò che segue è stato preso dal libro di Tomas Kyte. Spero non me ne voglia.

Prima di iniziare vediamo cosa dice il manuale a proposito dei due file utilizzati per la configurazione di SQL*PLUS:

SQL*Plus Configuration You may wish to set up your SQL*Plus environment in a particular way (such as showing the current time as part of the SQL*Plus command prompt) and then reuse those settings with each session. You can do this through two host operating system files, the Site Profile for site wide settings, and the User Profile for user specific settings. The exact names of these files is system dependent; see the Oracle installation and user's guide provided for your operating system for the precise name.

Site Profile
SQL*Plus supports a global Site Profile, a SQL*Plus script created by the database administrator. This file is generally named glogin.sql. SQL*Plus executes this script whenever any user starts SQL*Plus and SQL*Plus establishes the Oracle connection. The global Site Profile allows the DBA to set up SQL*Plus environment defaults for all users at a particular site; users cannot directly access the Site Profile.

The site profile file is $ORACLE_HOME/sqlplus/admin/glogin.sql. If a site profile already exists at this location, it is overwritten when you install SQL*Plus. If SQL*Plus is removed, the site profile file is deleted.

User Profile
SQL*Plus also supports a User Profile, executed after the Site Profile. This file is generally named login.sql. SQL*Plus searches for the user profile in your current directory, and then the directories you specify with the SQLPATH environment variable. SQL*Plus searches this colon-separated list of directories in the order they are listed.

You can add any SQL commands, PL/SQL blocks, or SQL*Plus commands to your user profile. When you start SQL*Plus, it automatically searches for your user profile and runs the commands it contains.

A user profile is ineffective in the iSQL*Plus user interface context, and cannot be used to control the initial settings or behavior of an individual iSQL*Plus session.

Qundi:
  1. Viene letto il glogin.sql;
  2. Viene letto il login.sql, se trovato;
Il vantaggio, a mio avviso, di utilizzare tutte le configurazioni nel glogin, è quello di avere una gestione uniforme del prompt sull'host da cui eseguiamo SQL*Plus. In qeusto modo, chiunque esegua una connessione oracle verso un database, otterrà sempre lo stesso tipo di prompt.
L'espressione "se viene trovato", indicata al punto 2, vuol dire che la lettura del login.sql è subordinata all'esistenza della variabile d'ambiente SQLPATH. Nel nostro caso, tale variabile, sarà vitale per il corretto funzionamento di quanto descritto di seguito.

Le impostazioni di stotto riportate, vanno aggiunte in calce al file glogin.sql

REM "serveroutput" controlla l’output del package DBMS_OUTPUT.PUT_LINE. In genere si desidera che
REM "serveroutput" siasempre impostato ad ON ed il buffer relativo sia il più grande possibile.
set serveroutput on size 1000000 format wrapped

REM
column object_name format a30
column segment_name format a30
column file_name format a60
column name format a30
column plan_plus_exp format a100

REM Di default, una linea in un file di spool è a lunghezza fissa, con spazi bianchi
REM che la completano se necessario. "trimspool" elimina tali spazi bianchi
REM rendendo il file significativamente più piccolo
set trimspool on

REM "long" controlla quanto di un campo LONG o CLOB, SQL*Plus debba mostrare. Il
REM valore di default è 80 caratteri che possono essere troppo pochi. Di seguito
REM viene lo impostiamo in modo da utilizzare i primi 1000 caratteri
set long 1000

REM Questo paramentro imposta l’ampiezza di riga per cui SQL*Plus wrappa l’output
set linesize 130

REM SQL*Plus stampa l’intestazione delle colonne ogni N righe di output, che di default è 14.
REM A volte questo output può essere fastidioso, così lo si può modificare
set pagesize 20

REM Imposta il l’editor di default
define _editor=vi

La personalizzazione del prompt va configurata nel file login.sql, per motivi che saranno chiariti tra breve.

REM Disabilita l’output del terminale: fa in modo tale di non stampare nulla quando si esegue il login
set termout off

REM Di seguito viene impostato il prompt di SQL*Plus a "DATABASE(USERNAME)> ". Viene utilizzato
REM NEW_VALUE per formattare il prompt, il cui valore di default è IDLE (molto utile ai dba. Il prompt
REM sarà IDLE se il db non è ancora partito)
define gname=idle
column global_name new_value gname
select substr(global_name,1, decode(dot,0,length(global_name),dot-1))||'('|| user||')' global_name
   from (select global_name, instr(global_name,'.') dot
      from global_name);
set sqlpromt ‘&gname> ’

REM Riabilita l’output del terminale
set termout on

Di seguito un esempio di output del prompt. Per comodità personale, poiché da Oracle9i non è più possibile connettersi come utente internal, ho creato il seguente alias nel .bash_profile dell'utente oracle:

alias internal='sqlplus "/as sysdba"'

[nispushtest.PUSHTEST]/sbrdbms/oracle->internal

SQL*Plus: Release 9.2.0.6.0 - Production on Wed Mar 29 13:27:21 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
With the Partitioning option
JServer Release 9.2.0.6.0 - Production

PUSHTEST(SYS)>

Una volta lanciato, il prompt di SQL*Plus non cambia col cambiare dell'utente. Questo è perché i files di configurazione glogin.sql e login.sql viengono letti una sola volta (alla prima esecuzione appunto. Questo comportamento cambia, come vedremo, a partire da Oracle 10g). Ciò vuol dire che al successivo comando di connect, le impostazioni di SQL*Plus non vengono modificate. Il, trucco allora, risiede nell’usare lo script connect che rilancia il glogin.sql ogni volta:

REM Configurazione di connect.sql
connect &1
@glogin

Affinché tutto funzioni è necessario impostare la variabile d’ambiente SQLPATH. Utilizzando tale variabile, puossiamo mettere connect.sql, login.sql ed altri scripts in un’unica directory e fare in modo che SQL*Plus li trovi per noi. SQL*Plus cercherà dapprima nella directory corrente e poi in quella specificata in SQLPQTH. In questo caso ho impostato SQLPATH come:

SQLPATH=$ORACLE_HOME/sqlplus/admin

Di seguito quindi, un esempio di cambio utente:

PUSHTEST(SYS)> @connect nip
Enter password:
PUSHTEST(NIP)>

Sempre nella direcotry $SQLPATH, conviene creare un link simbolico a connect.sql, nel seguente modo:

ln -s connect.sql conn.sql

così facendo, è possibile utilizzare anche la forma abbreviata di connect, simulando del tutto la connessione ad un nuovo utente da SQL*Plus:

PUSHTEST(SYS)> @conn nip
Enter password:
PUSHTEST(NIP)>

Tutto funziona anche se configuriamo il prompt a partire dal file login.sql e non dal glogin.sql. In questo caso va modificato il connect.sql, cambiando la stringa da "@glogin" a "@login".
A partire da Oracle 10g comunque, il comportalemto di login.sql e glogin,sql cambia. Di seguito riporto un estratto dal manuale:

SQL*Plus - Run glogin.sql and login.sql After Each CONNECT The glogin.sql and login.sql scripts are now read after each CONNECT command, rather than just
when SQL*Plus is started, affording easy per-connection configuration.

Questo vuol dire che a partire da Oracle 10g, non è più necessario creare lo script connect.sql, come indicato sopra. Vediamo infatti qual è il nuovo comportamento di Oracle (questa volta il database è su un sistema Windows):

C:\>sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.2.0 - Production on Sab Apr 1 19:36:25 2006

Copyright (c) 1982, 2005, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options

SALZI(SYS)> conn andrea
Enter password:
Connected.
SALZI(ANDREA)>