Cloud with rain
.:G
G:.
0 and 1 serie, black on white
pulled card
myjsp.feelinglinux.com
ver. 1.1.9-4
Hallo, welcome to my world.
Here you can find some stuff about computer science.
<<< Enjoy your visit! >>>
0 and 1 serie, white on black

SQL - Pezzi di SQL per DB Oracle 8

        Scritto: Giansante Gabriele, 17/09/2002     

Testato su "Oracle 8", Linux
Ovvero qualche pezzo di codice, giusto per ricordare. Non e' detto che il codice qui contenuto sia ottimizzato.
Ho esequito questo codice SQL sotto Oracle 8, ma in gran parte puo' andare bene anche su altri database.
Frammenti di SELECT
  •   select * from tab 
    E' un classico per vedere quali tabelle sono presenti nel db.
  •   select * from tabs
    Assolutamente analogo al precedente, tranne per il fatto che le informazioni restituite sono molte di piu'.
  •   select trim(' 45   ')+10 from dual
    Cast automatico. Restituisce: 55
  •   select ' 45 '-' 8 '+10 from dual
    Cast automatico. Restituisce: 47
  •   select substr('65401'+520,3,2)/2 from dual
    Cast automatico. Restituisce: 46
    1) '65401'+520=65921; 2) substr('65921',3,2)='92'; 3) '92'/2=46

  •   select trim(null) from dual
      select trim(null)||null from dual
      select substr(trim(null)||null-null*null/null,null) from dual
    Cast automatico. Restituisce: null, per ognuna delle tre query.
    Mix di cast automatici ed operazioni su valori nulli. Attenzione che la divisione per null non provoca errore, ma la divisione per 0 si'.

  •   select count(*), 'forum vendite' from forum_vendite where nome is null
      union
      select count(*), 'forum acquisti' from forum_acquisti where nome is null
    Tabelle con nomi inventati (dei forum vendite ed acquisti potrebbero essere realizzati in altro modo...). Il risultato potrebbe essere il seguente:
    [(8, 'forum vendite'), (14, 'forum_acquisti')]

  •   select mia_sequenza.currval as id from dual
    Posto che mia_sequenza sia una sequenza, ottengo il valore corrente della sequenza stessa. Per ottenere il successivo "mia_sequenza.nextval".
  •   select count(*), tipo_merce from merci group by tipo_merce
    Conto quanti elementi di una particolare "merce" sono presenti nella tabella "merci". Grazie al "group by" non ho duplicati.
  •   select to_char(null,'DD/MM/YYYY') as data_prova from dual
    Restituisce null.
  •   select (
        select (
          select count(*) from messaggi_forum where id=24
        ) as numero_messaggi from dual
      ) as farsi_del_male from dual
    Giusto per fare un po' di scena... e di casino.

Frammenti di ALTER (table, ecc.)
  • alter table clienti add i_prodotti_acquistati number null
    Modifico la tabella clienti aggiungendo un campo di tipo number che puo' essere "null".

Frammenti di CREATE (index, sequence, table, ecc.)
  •   create sequence id_messaggi_forum 
        increment by 1 
        start with 100
    Ho creato una sequenza da associare a dei fantomatici id di messaggi di forum. Il valore successivo della sequenza si ottiene con un incremento di 1 ed il valore iniziale (primo valore in assoluto ottenibile dalla sequenza) e' 100. La sequenza fornira' valori 100, 101, 102, ecc.
  •   create table profili_utenti 
      ( 
        id_profilo number not null, 
        id_utente number not null,
        primary key (i_profilo, i_utente)
      )
    		
    Esempio di creazione di una tabella ed assegnazione della chiave primaria. Entrambi gli attributi non possono assumere valori nulli.
    N.B. Non importa il senso che puo' avere la tabella.


Frammenti di DROP (index, sequence, table, ecc.)
  • drop sequence id_messaggi_forum
    Eliminazione della sequenza.

Frammenti di INSERT
  •   insert into profili_utenti 
        select distinct(id_utente), 1 
        from utenti
    		
    Esempio classico. I valori da inserire nella tabella provengono da un select. L'importante e' che coincidano il tipo ed il numero degli attributi fra la tabella dove inserire e quella generata dal select. In questo caso la tabella ha come definizione profili_utenti(id_profilo number not null, id_utente number not null). La chiave primaria e' data dalla tupla intera (id_profilo, id_utente), vedi esempi "CREATE". Per questo motivo uso il distinct sull'id_utente della tabella utenti. L'unica cosa da sapere sulla tabella utenti e' che l'id_utente fa parte della chiave primaria e non puo' avere valori nulli. Se cosi' non fosse, potrebbero esserci dei problemi durante l'inserimento. Un'ultima cosa.
  •   Non va!!!
      insert into amministratori_forum_archivio
        select id_amministratore, id_forum, data_inizio
        from amministratori_forum
        where id_amministratore=12792 and id_forum=31
    
      Ok!
      insert into amministr_forum_archivio
        select id_amministratore, id_forum, to_date(to_char(data_inizio))
        from amministratori_forum
        where id_amministratore=12792 and id_forum=31
    
      Ok!
      insert into amministratori_forum_archivio
        select id_amministratore, id_forum, trunc(data_inizio)
        from amministratori_forum
        where id_amministratore=12792 and id_forum=31
    
      Ok!
      insert into amministratori_forum_archivio
        select id_amministratore, id_argomento, sysdate
        from amministratori_forum
        where id_amministratore=12792 and id_forum=31
    		
    Quest'esempio e' un po' particolare. Il primo insert non funziona, o meglio, non provoca errore ma si blocca in attesa per un tempo indefinito. Le piccole trasformazioni dei 3 insert successivi, consentono al tutto di funzionare. Ok, e' vero, alcuni non fanno la stessa cosa del primo, ma e' interessante vedere quali tipi di insert funzionino e quali no. Il tutto si e' verificato su Ora8.

Frammenti di UPDATE
  •   update rivista set 
        stato=3, 
        data_ultimo_intervento=(
          select data_scrittura 
          from editoriali 
          where id_editoriale=6
        ) 
      where id_rivista=24;
    		
    Lasciando perdere i nomi delle tabelle e degli attributi, sto modificando il valore di piu' attributi contemporaneamente. Inoltre il valore del secondo attributo viene pescato da una query.
  •   update schede_film set 
        stato=21 
      where id_film in
      (
        select id_film
        from schede_film 
        where data_uscita<(sysdate+7) and 
          data_uscita>=to_date('08/2002','mm/YYYY') 
      )
    		
    Rispetto al caso precedente, effettuo una subquery nella condizione per trovare le tuple da aggiornare.

Hai trovato utile questo articolo?
Aiutami a condividerlo o metti un "mi piace".
Grazie mille!


Gli strumenti di condivisione (Google+, Facebook) sono visibili in alto a destra solo dopo aver accettato la policy di utilizzo dei cookie per questo sito.
FAQ - Come faccio a cambiare la mia scelta?

 

Strumenti (myjsp.feelinglinux.com)
Gioco: allenamento con la tastiera Strumenti di codifica/decodifica URI (%-encoding) e Base64 Strumenti di calcolo online per IP e Reti
QUIZ GAME
Quiz game

Cerca @myjsp.feelinglinux.com

Pubblicita'