Archivio maggio 2008

Costrutti per query ricorsive in Oracle 0

mag28

Chi ha avuto a che fare con un database relazionale, si sarà trovato almeno una volta a dover risolvere un problema in maniera ricorsiva, ad esempio per ricostruire rapporti padre-figlio.

Per risolvere semplicemente il problema si può far ricorso a particolari costrutti atti a costruire query ricorsive o più propriamente dette query gerarchiche.

Proviamo ad analizzare un possibile scenario:

CREATE TABLE utenti (
    id_utente NUMBER(22),
    id_padre  NUMBER(22) NULL,
    descrizione VARCHAR2(255 Byte)
    CONSTRAINT PK_UTENTI PRMARY KEY (id_utente)
    CONSTRAINT FK_PADRE_FIGLIO FOREIGN KEY (id_padre) REFERENCES UTENTI (id_utente)
);

Abbiamo la tabella UTENTI che ha, oltre all’identificativo dell’utente e ad una descrizione, un altro campo che punta all’identificativo dell’utente padre.

In questo modo è possibile creare un vero e proprio albero.

Se volessimo ad esempio selezionare tutto l’albero a partire dall’utente con ID_UTENTE pari a 15 potremmo utilizzare la seguente query:

SELECT * FROM utenti
START WITH id_utente = 15
CONNECT BY PRIOR id_utente = id_padre
ORDER BY id_utente

Con il costrutto START WITH si specifica una condizione che identifica le righe che
devono essere usate come radici della gerarchia.
Con CONNECT BY PRIOR si da una condizione che identifica le relazioni fra righe padre
e righe figlie dell’albero.

Per saperne di più vi rimando al link Oracle Connect By Function

Le funzioni condizionali in SQL 0

mag28

Spesso si ha la necessità di scrivere delle query molto complesse o composte da varie sottoquery in union fra di loro; si avverte il desiderio di poter specificare una condizione su uno o più dei campi da selezionare per rendere la query più semplice e leggibie e lasciare l’onere della risoluzione all’ottimizzatore del dbms.

Per fare tutto ciò vengono in nostro aiuto le funzioni condizionali o funzioni di comparazione ovvero delle funzioni (o addirittura dei costrutti logici) in grado di discriminare diversi casi nei campi di selezione.

Facciamo subito un esempio per chiarire la situazioe: data la tabella TABLE1 con i campi A e B, si vuole selezionare A quando A > 100 e B negli altri casi. Per risolvere questa semplice richiesta si può scrivere ad esempio la seguente query:

SELECT A AS RES FROM TABLE1 WHERE A > 100
UNION
SELECT B AS RES FROM TABLE1 WHERE A < 101

Un’alternativa equivalente alla query precedente potrebbe essere la seguente:

SELECT CASE WHEN A > 100 THEN A ELSE B END AS RES

In questo caso si è usato un costrutto molto semplice e molto simile a quello utilizzato in un qualsiasi linguaggio di programmazione. La query risulta più breve e leggibile e l’onere di come questa verrà svolta è lasciato al dbms.

Oltre al costrutto CASE vi sono altre utili funzioni condizionali:

NVL(A, B) seleziona A se è non nullo altrimenti B (Oracle)

IFNULL(A, B) seleziona A se è non nullo altrimenti B (MySql)

COALESCE(A, B, C , D, …) seleziona il primo valore non nullo fra quelli indicati (Oracle, MySql, Postgres)

NULLIF(A, B) seleziona NULL solo se A e B sono uguali altrimenti seleziona A (Postgres)

Vi sono molte altre espressioni condizionali che variano leggermente dal dbms che utilizzate.

Per alcuni esempi vi rimando alle documentazioni ufficiali:

Oralce 10g, MySql 6.0, Postgres 8.3, DB2

Presentazione di Java 2 Micro Edition 0

mag24

La grande diffusione di dispositivi di comunicazione mobili quali telefoni cellulari, videotelefoni, cercapersone, palmari, agende elettroniche ed altro ancora ha reso necessario lo sviluppo di una piattaforma comune per lo sviluppo di applicazioni.

Tutti questi dispositivi sono accomunati da limitate risorse hardware, da funzionalità spesso ristrette e da un’autonomia limitata nel tempo.

Sun Microsystem ha quindi sviluppato J2ME (Java 2 Micro Edition) ovvero un ambiente di sviluppo per dispositivi mobili e non solo in grado di offrire un alto grado di flessibilità, di portabilità e di sicurezza.

J2ME è stato derivato da J2SE (Java 2 Standard Edition), sul quale è stato effettuato un lavoro di ottimizzazione e alleggerimento al fine di consentire il funzionamento su apparecchiature mobili di ultima generazione.

Un dispositivo che supporta J2ME consente di scaricare un’applicazione “MIDlet” di pochi kbyte (in alcuni casi sono permesse applicazioni di massimo 10KB ciascuna e 50 applicazioni totali sul terminale). Tali applicazioni, utilizzabili anche off-line, vengono installate sul device automaticamente o attraverso un trasferimento manuale con cavi di collegamento e applicazioni specifiche per la sincronizzazione.

Oltre che per le limitazioni di memoria e di potenza di elaborazione, J2ME deve adattarsi anche a display particolarmente ridotti, ad esempio un piccolotelefono cellulare può disporre di 12.288 pixel (96 ×128), oppure un PDA di 20.000 anche se il continuo progresso tecnologico in questo settore tende ad abbattere queste limitazioni con schermi sempre più ampi e con sempre più colori.

L’esecuzione di una applicazione si basa su una Java Virtual Machine, presente nei terminali, che interpreta ed esegue il codice. J2ME comprende due livelli di configurazione: CDC (Connected Device Configuration) e CLDC(Connected Limited Device Configuration) che si differenziano per le risorse hardware a disposizione.

L’idea avuta da Sun nello sviluppo di J2ME è quella di fornire una base comune per tutti i dispositivi aventi un set limitato di API sufficiente per fornire le funzionalità basilari per un qualunque apparecchio con limitate risorse di configurazione.

Potranno poi essere i produttori dei dispositivi ad aggiungere funzionalità al CLDC, sotto forma di librerie, generando così un’estensione della configurazione.

I vantaggi di questa tecnologia rispetto a modalità preesistenti come il Wap e Sim Toolkit, sono esplicabili in tre punti fondamentali:

  • la possibilità di sfruttare le applicazioni in locale, residenti e funzionanti anche off-line
  • la capacità elaborativa
  • la flessibilità nell’installazione di nuove applicazioni la flessibilità nell’installazione di nuove applicazioni
  • la flessibilità nell’installazione di nuove applicazioni

la flessibilità nell’installazione di nuove applicazioni

la flessibilità nell’installazione di nuove applicazioni

Va inoltre ricordato che lo sviluppo in Java è derivabile da quello in C++, è quindi di estrema facilità la conversione di risorse e applicazioni C++ preesistenti in codice Java.

Confrontando le API’s di J2ME con quelle di J2SE si nota un notevole snellimento anche se molte delle classi di largo uso (Vector, Stack…) sono rimaste inalterate, con le dovute limitazioni del caso; sono state inoltre completamente eliminate tre utili funzionalità:

  • numeri in virgola mobile, dato che non si può essere certi che un CLDC abbia hardware necessario
  • JNI (Java Native Interface), per un eccessivo consumo di memoria
  • introspezione, quindi serializzazione ed RMI non supportati.

Stack J2ME

Al fine garantire flessibilità nel variegato mondo dei dispositivi embedded, l’architettura J2ME è modellata per essere modulare e scalabile.

Queste caratteristiche sono ottenute da J2ME con la definizione di tre strati di software, che si vanno ad aggiungere al sistema operativo del dispositivo:

  • Kilobyte Virtual Machine (KVM): la macchina virtuale Java,
    adattata per il sistema operativo di un particolare dispositivo.
  • Configurazione: definisce le caratteristiche minime di hardware per una categoria di dispositivi, ognuna caratterizzata da particolari parametri di memoria e potenza di processore. Una configurazione definisce anche le caratteristiche del linguaggio Java e della virtual machine nonché la libreria di classi che ci si aspetta di trovare su
    dispositivi della medesima categoria;
  • Profilo: è lo strato più esterno ed è costruito al di sopra dello strato configurazione. Il suo scopo è di garantire l’interoperabilità delle applicazioni all’interno di una certa famiglia di dispositivi, definendo un set standard di API per tale fascia di prodotti.

Un’applicazione, scritta utilizzando un determinato profilo, girerà su tutti i dispositivi che supportano tale profilo. I profili definiscono librerie più specifiche di quelle delle configurazioni, possono anche coesistere su una configurazione più profili contemporaneamente.

Fig. 1 Stack J2ME

Potenzialità relative alla connettività

I dispositivi mobili hanno per loro natura una predisposizione alla interconnettività e le loro funzionalità possono essere notevolmente ampliate grazie alla tecnologia J2ME.

Le applicazioni dei terminali mobili richiedono oggigiorno di scambiare dati con server remoti o con altre apparecchiature ed è per questo che Sun ha messo a disposizione delle API in grado di consentire lo svolgimento di queste attività.

Sono presenti non solo librerie per il semplice scambio di dati con altri dispositivi ma, dalla versione 2.0 della tecnologia, è stato implementato anche il protocollo Https per le comunicazioni sicure.

Grazie a questa novità si apre la strada per l’implementazione di applicazioni inerenti al commercio elettronico e alla finanza, le quali vanno ad affiancare quel settore di programmi che sfruttano la connettività per offrire servizi semplici che non richiedono particolare protezione dei dati, come ad esempio chat, giochi on-line, navigazione internet ed altro.

Sono inoltre presenti librerie aggiuntive a quelle presenti di default chiamate WMA (wireless messaging API) che consentono di sfruttare tutte le potenzialità del protocollo SMS (short message system) per lo scambio di messaggi di testo e non solo.

IT c.s.p. usa una versione modificata di FREEmium Theme.
Politiche sulla privacy - Copyright