top of page
  • Immagine del redattoreElvis Informatico

Sqlplus vs SqlDeveloper: non si capiscono!

A tutti gli sviluppatori di applicazioni progettate su DB Oracle (Database): vi sarà capitato sicuramente di rilasciare blocchi pl/sql (procedural language/structured query language), magari li avete eseguiti con successo nei vostri ambienti di sviluppo attraverso il tool grafico SqlDeveloper, ma quando il vostro codice è stato rilasciato presso clienti, i DBA (Database Administrator) hanno utilizzato il tool a riga di comando SqlPlus e vi hanno segnalato che i vostri script hanno generato errori di sintassi. La prima frase che viene in mente agli sviluppatori è: "ma a me ha funzionato!". E i DBA solitamente rispondono: "ma a noi no!". Calma, avete ragione entrambi. Il problema è l'interprete dei comandi: SqlPlus è molto più scarno, come un vecchio ottuso poco avvezzo al cambiamento ma molto quadrato ed efficace; mentre SqlDeveloper è giovane, simpatico ed intraprendente e riesce a venirvi incontro. Entrando più nel merito, dove SqlPlus sembra incaxxarsi di più è nell'uso del segno "/", tale simbolo indica l'esecuzione del blocco di codice. Se usate una Begin, quando - terminate le istruzioni - chiuderete con End il blocco, SqlPlus avrà solamente bufferizzato nella cache l'intero pezzo di codice, ma non lo eseguirà fintantoché non apporrete il simbolo "/", anche se doveste mettere un commit dopo l'End. Il più simpatico SqlDeveloper invece, essendo più giovane e smart, è in grado di capire le vostre intenzioni ed eseguirà lo script senza alcun problema pur non avendo il "/". In generale, lavorare con SqlPlus è sempre meglio, poiché i rilasci si eseguono spesso da riga di comando e sui server di Produzione generalmente non vengono installati tool grafici. Ecco un esempio di uno script sql funzionante su sqlplus:


DECLARE a number;

BEGIN

SELECT count(*) INTO a FROM user_tab_columns WHERE table_name = 'xxx';

IF a = 0 THEN

EXECUTE IMMEDIATE 'ALTER TABLE xxx ADD xxx NUMBER(20) NULL';

END IF;

SELECT DATA_PRECISION INTO a FROM user_tab_columns WHERE table_name = 'xxx' AND column_name = 'xxx' AND data_type = 'NUMBER';

IF a < 20 THEN

EXECUTE IMMEDIATE 'ALTER TABLE xxx MODIFY xxx NUMBER(20)';

END IF;

END;

/


Come vedete, il simbolo "/" è posto esattamente dopo l'End, sqlplus dunque eseguirà la procedura senza problemi. Se non doveste mettere il "/", sqlplus non restituirà più il prompt dei comandi in quanto resterà in attesa del comando di esecuzione "/" non presente nel vostro script, solo un comando di kill (ctrl-c) potrà restituirvi il prompt ma senza aver eseguito il blocco.











54 visualizzazioni0 commenti

Post recenti

Mostra tutti
bottom of page