SQL*Plus 12.2

giovedì 20 aprile 2017 alle 20:10 | Pubblicato su 12c, SQL, Varie | 1 commento
Tag:

Oggi ho provato a installare la versione 12.2 del nuovo instant client Oracle versione 12.2 sul mio pc aziendale con sistema operativo Win7. Non ci sono motivi particolari per cui ci sia la necessità di passare ad usare questa versione se non al puro scopo di testarla e tal proposito mi sono ricordato di un post di Mike Dietrich (anche perché l’ho letto ieri 🙂 ) dove si parla che una fra le novità di questa versione di SQL*Plus è la diversità di comportamento nel caricamento del file “login.sql”. Io normalmente uso sul mio pc una configurazione per cui lancio uno script .cmd che a sua volta chiama un’altro script che setta le opportune variabili d’ambiente, fra cui SQLPATH affinché punti a una directory dove trovo una serie di script di utilità (per molti dei quali vanno i ringraziamenti a Tanel Poder)  e l’utilissimo login.sql che imposta l’ambiente iniziale per SQL*Plus come garba a me. Con la nuova versione di SQL*Plus effettivamente l’esecuzione automatica di login.sql che si trova sotto il percorso puntato dalla variabile d’ambiente SQLPATH non funziona. Infatti il post di Franck Pachot cui fa riferimento Dietrich fa tutti i test dettagliati su ambiente Linux, peccato però che come scrive Dietrich alla fine del suo post:

On Windows please be aware of (credits to Tim Hall):

  • Bug 25804573SQL PLUS 12.2 NOT OBSERVING SQLPATH IN REGISTRY OR ENV VARIABLE FOR LOGIN.SQL

 

Ti pareva se su Winzoz non c’era qualche fastidio…

Sinceramente non mi è chiaro come aggirare il problema, la soluzione che ho adottato io sembra bruttina ma è l’unica che ho trovato in modo veloce: ho rinominato sqlplus.exe in sqlplus_orig.exe, ho creato un file sqlplus.cmd il cui contenuto è:

sqlplus_orig.exe %1 @login

Ora, prima ho provato a non rinominare il file .exe confidando che la logica di ricerca degli eseguibili mettesse prima i .cmd e dopo i .exe ma non sembra esssere così. La cosa che invece mi perplede abbastanza è il fatto che se metto @login.sql non funziona, @login si. Anche se invoco successivamente @login.sql non funziona, funziona se lo invoco con il percorso completo

SYSTEM@svil121 > @login.sql
SYSTEM@svil121 > @c:\oracle\conf\login.sql

PL/SQL procedure successfully completed.


Session altered.

Questa particolarità vale solo per il file login.sql, gli altri script funzionano sia che metta l’estensione  e sia che non la metta

 

 

Annunci

Variabili in SQL*Plus

venerdì 14 agosto 2009 alle 14:30 | Pubblicato su Diario, Varie | 1 commento
Tag: ,

SQL*Plus è lo strumento primario di accesso a un database Oracle. Come ha intitolato Tanel Poder una serie di suoi post, sqlplus è la seconda casa del DBA Oracle. Ovunque c’è un database Oracle c’è un sql*plus, non sempre si ha a disposizione altri client, grafici, che magari facilitano e velocizzano certe operazioni, ma solitamente rendono più difficili altre. Ho gia manifestato in passato la mia preferenza per le CLI (command line interface) a scapito delle GUI (graphical user interface). Io utilizzo come interfaccia grafica sul mio pc solo SQL Developer, del quale ho gia parlato descrivendo aspetti positivi e negativi. Il motivo principale per cui utilizzao un client grafico è per avere un output tabellare facile da esaminare, anche se in realtà sempre Tanel Poder ha mostrato come anche questo si può avere in sql*plus.

Il fatto è che anche SQL*Plus come tutti i programmi con interfaccia a linea di comando richiede esperienza, memoria dinamicità ed elasticità mentale.

Qualche giorno fa facendo una ricerca su Google sul’opzione -prelim di sqlplus, citata da Jonathan Lewis in un suo post (infatti ne aveva accennato qualche giorno prima, ma senza spiegare cosa fosse  Miladin Modrakovic in un post che spiega come accedere ad alcune viste fisse tramite accesso diretto alla SGA), sono capitato su questa parte del sito di Oracle, dedicata appunto a SQL*Plus. In questa sezione ho notato un interessante documento intitolato “SQL*Plus Substitution Variables“, documento molto interessante che consiglio a tutti i DBA che vogliono fare un ripasso sull’argomento. Leggendo quel documento mi si è sbloccato qualcosa nel cervello. Mi succede ogni tanto, un concetto mi rimane inceppato li e non riesco a digerirlo per un bel po’ di tempo (in questo caso possiamo parlare di anni) fino a quando tutt’a un tratto vedo la luce, così è stato con “Substitution Variables” in SQL*Plus.

Devo confessare che facevo un po’ confusione fra Bind Variables, quelle che in SQL*Plus si definiscono con il comando VAR[IABLE] [variable [type]] e le “Substitution Variables” che chiamerò “variabili di sostituzione” o semplicemente variabili di sql*plus. Perché le variabili di sql*plus in effetti sono variabili elaborate solo in sql*plus, mentre le bind variables sono variabili elaborate dal database server Oracle, tant’è che per valorizzarle si usano blocchi di PL/SQL e permettono di simulare i preparedStatement .

Le variabili di sql*plus si possono definire in modo esplicito con il comando DEFINE, facendo help define da sqlplus:

DEFINE
——

Specifies a substitution variable and assigns a CHAR value to it, or
lists the value and variable type of a single variable or all variables.

DEF[INE] [variable] | [variable = text]

Ecco, una caratteritica è che in questo modo si possono definire variabili solo di tipo “CHAR”. Però implicitamente è possibile definire anche varibili di tipo NUMBER (non sono previsti altri tipi). Il modo per ottenere variabili di tipo NUMBER è quello di utilizzare il comando ACCEPT, ad esempio (dal manuale);

ACCEPT ENUMBER NUMBER PROMPT 'Employee ID. :'

infatti:


SVILUPPO40@perseo10 > ACCEPT ENUMBER NUMBER PROMPT 'Employee ID. :'
Employee ID. :12
SVILUPPO40@perseo10 > define ENUMBER
DEFINE ENUMBER         =         12 (NUMBER)

Un’altro metodo è utilizzando un trucco che mi piace molto, cioè l’opzione new_value del comando COLUMN:


SCOTT@perseo10 > col empno new_value v_empno
SCOTT@perseo10 > select empno from emp where ename='ALLEN';

 EMPNO
----------
 7499

SCOTT@perseo10 > DEFINE V_EMPNO
DEFINE V_EMPNO         =       7499 (NUMBER)

Se si vogliono vedere utilizzi avanzati delle variabili di sql*plus si possono andare a vedere script per i test utilizzati da Tom Kyte nel suo libro o quelli pubblicati da  Alberto Dell’Era per fare due esempi.

Le variabili vengono solitamente utilizzate per automatizzare il più possibile gli scritpt fare elaborazioni sui valori occorre fare dei magheggi, ad esempio:


SCOTT@perseo10 > select &v_empno+1 empno from dual;
vecchio   1: select &v_empno+1 empno from dual
nuovo   1: select       7499+1 empno from dual

 EMPNO
----------
 7500

SCOTT@perseo10 > DEFINE V_EMPNO
DEFINE V_EMPNO         =       7500 (NUMBER)

Nell’esempio si vede come si utilizza una variabile di sqlplus, ovvero premettendola con il simbolo “&” (impostazione modificabil con il comando “SET DEF[INE] {&|c|ON|OFF}”.  Se la variabile non è stata definita in precedenza viene chiesto un valore al prompt:


SCOTT@perseo10 > select &newvar from emp;
Immettere un valore per newvar: empno
vecchio   1: select &newvar from emp
nuovo   1: select empno from emp

 EMPNO
----------
 7499
 7521
 7566
 7839

SQL*Plus effettua la sostituzione della variabile con il valore prima di eseguire l’operazione e per ogni riga del comando mostra una coppia di righe che iniziano la prima con la stringa “vecchio” (o old) la seconda con “nuovo” (o new) come si vede dall’esempio. In sostanza mostra la riga prima e dopo la sostituzione. Questo comportamento può essere disabilitato con il comando “SET VERIFY OFF”.

Un’altra cosa interessante da dire è  che le variabili possono essere utilizzate premettendo al nome uno o due “&”, la differenza è che quando si usa la doppia “&&” SQL*Plus mostra un prompt per richiedere un valore solo la prima volta che trova la variabile, le successive (anche se in quelle si usa un solo “&”) non lo richiede più e usa sempre lo stesso valore, altrimenti lo richiede ad ogni occorrenza.

Quelle di cui ho parlato sono le caratteristiche che mi interessano e piacciono di più e che voglio memorizzare, altre sono descritte sia qui che naturalmente sul manuale (piccola nota: non è che mi piaccia molto la struttura molto frammentata della manualistica introdotta con la versione 11g).

Quasi dimenticavo,  tempo fa scrissi questo post, un commentatore mi diede una buona indicazione che porta ad un’altra possibilità interessante delle variabili di sostitizione, spiegata sul manuale , ecco un esempio:


C:\oracle\instantclient_11_1>more test_pars.sql
set verify off
select * from emp where empno=&1
/
exit;

C:\oracle\instantclient_11_1>sqlplus scott/tiger@perseo10 @test_pars 7499

SQL*Plus: Release 11.1.0.6.0 - Production on Fri Aug 14 15:37:26 2009

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

Connesso a:
Oracle Database 10g Release 10.2.0.4.0 - Production

Procedura PL/SQL completata correttamente.

Modificata sessione.

 EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
 7499 ALLEN      SALESMAN        7698 20-02-1981 00:00:00       1840        300         30

Disconnesso da Oracle Database 10g Release 10.2.0.4.0 - Production

C:\oracle\instantclient_11_1>

Ci sono moltre altre cose che voglio approfondire e impare meglio su sql*plus, ne parlerò in altri post, altrimento questo diventa troppo confusionario.

SQL*Plus e SQL Developer

giovedì 29 gennaio 2009 alle 29:50 | Pubblicato su Installation and Configuration, SQL, Varie | Lascia un commento
Tag: , , ,

Tempo fa ho parlato di SQL Developer, la data del post è  17 Luglio 2008.  Ebbene, a sei mesi di distanza ho scoperto un problema di convivenza sul mio PC fra SQL Developer e SQL*plus, quello fornito con l’instant client.  In realtà più volte mi è capitato cercando di aprire sqlplus da linea di comando di avere il seguente messaggio:

C:\Documents and Settings\ccudizio>sqlplus
Error 57 initializing SQL*Plus
Error loading message shared library

Per lungo tempo ho rinunciato a capire cosa diavolo fosse, ma in questi giorni ho scoperto che si tratta di un problema di convivenza con SQL Developer, infatti, tale errore capita se ho gia aperto SQL Developer (anche senza alcuna connessione aperta) e appena chiudo SQL Developer tutto torna a funzionare bene:

C:\Documents and Settings\ccudizio>sqlplus
SQL*Plus: Release 11.1.0.6.0 – Production on Thu Jan 29 12:43:54 2009
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
Enter user-name:

E’ una cosa veramente fastidiosa e non sono ancora riuscito a capire come risolverla, non è un problema (apparentemente) di path che ho provato a cambiare.

Trovo SQL Developer un buon programma, anche se a volte mi fa innervosire perché per la sua smania di autocompletare spesso e volentieri si blocca per intervalli di 2/3 secondi per caricare la lista dei possibili completamenti. 2/3 secondi non sono tanti, se non si è agitati e di fretta come spesso mi capita. Detto cio’ l’unico vero motivo per cui utilizzo  SQL Developer è per la possibilità di avere righe di output molto lunghe senza generare la confuzione che righe larghe generano su un terminale da 80 caratteri (che possono anche essere 120, ma spesso non bastano).

Autocommit e Commit on Exit

giovedì 18 dicembre 2008 alle 18:44 | Pubblicato su SQL, Varie | 1 commento
Tag: , ,

Oggi doppio post, infatti oggi ho scoperto due cose nuove. Dopo la nuova procedura purge del package dbms_shared_pool di cui ho parlato nel post precedente adesso è il momento di un nuova cosa che ho scoperto grazie a questo thread di CDOS. Si tratta di un comportamento di SQL*Plus, ma più in generale di Oracle. Ne ha scritto Eddie Awads più di tre anni fa ma io credo di non essermene mai accorto.

SQLPlus all’uscita (tramite comando EXIT o DISC) fa un commit implicito. La documentazione lo specifica, ma chi è mai andato a vedere la descrizione del comando exit sul manuale? Chiaramente chi lavora con Oracle impara abbastanza presto che bisogna sempre fare dei commit impliciti o espliciti e così è stato per me. Se sono uscito da sqlplus senza fare commit o rollback espliciti è perché non avevo modificato dati importanti, quindi non ho mai verificato il comportamento e quindi non ho mai capito che all’uscita veniva fatto un commit esplicito.

Ero convinto che il comportamento fosse lo stesso di quando una sessione in qualche modo “crasha” ed oracle la ripulisce facendo il rollback. Non è così. Chiaramente, nei programmi  a interfaccia grafica il problema non si pone. Ad esempio con SQL Developer all’uscita viene chiesto se committare o rollbackare (c’è anche una terza opzione che stronca brutalmente la connessione lasciando la sessione ed eventuali transazioni appese , ho provato e ne sconsiglio l’uso). In sqlplus invece la cosa è subdola.

Ho fatto anche un test con JDBC e con mia grande sorpresa (di nuovo) ho scoperto che anche qui il comportamento è lo stesso, come documentato la chiusura della connessione fa un commit implicito.

Questo comportamento si chiama (almeno credo) Commit on Exit. E’ diverso dal meccanismo chiamato autocommit che abilita il lancio di un commit automatico dopo ogni istruzione DML.

Blog su WordPress.com.
Entries e commenti feeds.