Oracle
Per selezionare le prime N righe occorre aggiungere la condizione WHERE ROWNUM <= N .
Se vogliamo definire un campo alternativo nel caso che il campo sia nullo occorre usare la funzione NVL(campo,valore sostitutivo).
Oracle non supporta AS nella clausola FROM, ma è comunque possibile specificare le variabili di tupla senza AS :
FROM Relation1 u, v Relation2
D'altra parte, Oracle supporta AS nella clausola SELECT , anche se l'uso di AS è completamente opzionale.
L'operatore di differenza in Oracle si chiama MINUS piuttosto che EXCEPT ma non vi è alcuna differenza.
L'operatore INTERSECT ALL non è implementato.
In Oracle, è sempre necessario il prefisso di riferimento con il nome della tabella ai campi ogni volta che questi appaioni in più di una tabella nella clausola FROM. Ad esempio, supponiamo di avere le tabelle R (A, B) e S (B, C) . La seguente query non funziona in Oracle, anche se B non è ambiguo perché R.B è equiparata a S.B nella clauola WHERE, infatti non si può scrivere:
SELECT B FROM R, S dove R.B = S.B
Invece, si dovrebbe usare:
SELECT R.B FROM R, S WERE R.B = S.B;
In Oracle, l'operatore logico di negazione ( NOT ) dovrebbe andare di fronte l'espressione booleana, non di fronte alla operatore di confronto. Ad esempio, " NOT A = ANY (<subquery>) "è una condizione valida di WHERE mentre " A = NOT ANY (<subquery>) " non lo è. (Si noti che " A <> ANY (<subquery>)" è una condizione valida ma è diversa) C'è una eccezione a questa regola: Si può usare sia" NOT A IN (<subquery>)" o "A NOT IN (<subquery>) ".
In Oracle, una relazione di alias è invisibile alle subquery della clausola FROM. Per esempio:
SELECT * FROM R S WHERE EXISTS (SELECT * FROM S)
è sbagliato, perché non trova S nella sottoquery, ma
SELECT * FROM R S WHERE EXISTS (SELECT * FROM R dove R.a = S.a)
è corretto.
In Oracle, una query che include
- una sottoquery nella clausola FROM, con GROUP BY, e
- una sottoquery nella clausola WHERE, con GROUP BY
può provocare un errore della connessione al database con ( ORA-03.113: end-of-file sul canale di comunicazione ), anche se i due clausole GROUP BY non sono correlati.
In Oracle, i commenti possono essere introdotte in due modi:
- Con /*...*/ , come in C.
- Con una linea che inizia con due trattini -- .
Per generare un campo da 16 byte come uniqueidentifier di microsoft SQL si può definire una colonna così:
nome_colonna RAW(16) Default SYS_GUID() NOT NULL
BIT tipo non è supportato. Vi è un tipo BOOLEAN in PL / SQL , ma non può essere utilizzato per una colonna del database.
Date e orari sono supportati in modo diverso in Oracle. Occorre utilizzare sempre la conversione in stringa:
SELECT TO_CHAR(miaData, 'YYYY/MM/DD') AS miaData FROM miaTabella;
Come valore di default si può usare SYSDATE per assegnare l'ora attuale al campo.
CHAR (n) può essere di lunghezza fino a 2000. VARCHAR (n) può essere di lunghezza fino a 4000.
Per creare un indice in Oracle, utilizzare la sintassi:
create [unique] index <index_name> on <table_name>(<attr_list>);
In generale, <attr_list> potrebbe contenere più di un attributo. Tale indice consente il recupero efficiente delle tuple con i valori indicati per <attr_list> . Opzionale, la parola chiave UNIQUE , se specificato, dichiara che <attr_list> può essere duplicato, e in effetti rende <attr_list> una chiave di <table_name> .
Per cancellare di un indice, utilizzare:
DROP INDEX <index_name>;
Oracle crea automaticamente un indice per ogni UNIQUE o PRIMARY KEY . Ad esempio, se si crea una tabella come segue:
create table foo (a int primary key, b varchar(20) unique);Oracle crea automaticamente un indice in foo.a e un altro sul foo.b . Si noti che non è possibile eliminare gli indici per UNIQUE e PRIMARY KEY.
Questi indici vengono eliminate automaticamente quando si rilascia la tabella o i vincoli chiave (vedere la sezione sui vincoli ).
Per vedre gli indici presenti si usa:
select index_name from user_indexes;
USER_INDEXES è un'altra tabella di sistema, proprio come USER_TABLES . Questo può diventare molto utile se si dimentica i nomi degli indici per cancellarli. Si potrebbe usare anche per vedere i nomi strani degli indici creati da Oracle per UNIQUE e PRIMARY KEY, anche se non si sarà in grado di eliminare questi indici.
Per scoprire quali sono i vincoli definiti nel database, utilizzare:
select constraint_name from user_constraints;
Oracle supporta vincoli di chiave, come specificato in SQL. Per ogni tabella, ci può essere solo una PRIMARY KEY , ma più UNIQUE. Ogni PRIMARY KEY (o UNIQUE ) può avere più attributi, il che significa che questi attributi insieme formano una chiave primaria (o una chiave, rispettivamente) della tabella.
Oracle supporta l'integrità referenziale (chiave esterna) , e consente un optionale ON DELETE CASCADE o ON DELETE SET NULL dopo una clausola REFERENCES in una dichiarazione di tabella. tuttavia, non permette ON UPDATE.
Si noti che quando si dichiara un vincolo di chiave, alla fine di una dichiarazione di tabella, è sempre necessario mettere l'elenco degli attributi di riferimento tra parentesi:
create table foo (... foreign key (<attr_list>) references (<attr_list>));Oracle supporta vincoli di attributo e tupla , ma non consente condizioni CHECK da utilizzare in sottoquery. Quindi, non c'è modo per un vincolo su attributo o tupla di riferirsi ad un attributo o una tupla che viene inserita o aggiornata.
Per quanto riguarda i vincoli generali, ASSERTION non è supportato, TRIGGER si.
Nel dichiarare un ALTER TABLE , Oracle supporta ADD ING colonne e vincoli di tabella, MODIFICARE le proprietà delle colonne ING e vincoli di colonna, e DROP vincoli ping no. Tuttavia, si può MODIFICARE un attributo a base di CHECK vincolo esempi. Eccone alcune:
create table bar (x int, y int, constraint XYcheck check (x > y)); alter table bar add (z int, w int); alter table bar add primary key (x); alter table bar add constraint YZunique unique (y, z); alter table bar modify (w varchar(2) default 'AM' constraint Wnotnull not null); alter table bar add check (w in ('AM', 'PM')); alter table bar drop constraint YZunique; alter table bar drop constraint XYcheck; alter table bar drop constraint Wnotnull; alter table bar drop primary key cascade;
L'eliminazione dei vincoli in genere richiede la conoscenza dei loro nomi (solo nel caso particolare della chiave UNIQUE o PRIMARY si può cancellare senza specificare i loro nomi).
Sintassi:
CREATE [OR REPLACE] TRIGGER <trigger_name> {BEFORE|AFTER} {INSERT|DELETE|UPDATE} ON <table_name> [REFERENCING [NEW AS <new_row_name>] [OLD AS <old_row_name>]] [FOR EACH ROW [WHEN (<trigger_condition>)]] <trigger_body>
Per le viste si può usare anche INSTEAD OF al posto di AFTER e BEFORE. Il FOR EACH ROW fa eseguire il trigger per ogni riga altrimenti parte una sola volta. In Oracle, nel corpo del trigger, non si può alterare la relazione la cui modifica è l'evento che scatena il trigger e non si può modificare una relazione connessa ad un'altra relazione conessa ad un altro trigger come un vincolo di chiave esterna.
ad esempio:
CREATE TABLE T4 (a INTEGER, b CHAR(10)); CREATE TABLE T5 (c CHAR(10), d INTEGER);
We create a trigger that may insert a tuple into T5 when a tuple is inserted into T4. Specifically, the trigger checks whether the new tuple has a first component 10 or less, and if so inserts the reverse tuple into T5:
CREATE TRIGGER trig1 AFTER INSERT ON T4 REFERENCING NEW AS newRow FOR EACH ROW WHEN (newRow.a <= 10) BEGIN INSERT INTO T5 VALUES(:newRow.b, :newRow.a); END trig1; . run;
Per vedere le informazioni dei trigger definiti si può usare:
select trigger_type, triggering_event, table_name, referencing_names, trigger_body from user_triggers where trigger_name = '<trigger_name>';
Per disabilitare/abilitare un tigger si usa:
alter trigger <trigger_name> {disable|enable};
Oracle supporta le transazioni, come definito dallo standard SQL. Una transazione è una sequenza di istruzioni SQL che Oracle considera come una singola unità di lavoro. Non appena ci si connette al database , una operazione comincia. Una volta che l'operazione ha inizio, ogni SQL DML (Data Manipulation Language) che si immette successivamente entra a far parte di questa transazione. Una transazione termina quando ci si disconnette dal database, o quando si immette un COMMIT o ROLLBACK.
COMMIT rende permanenti le modifiche del database fatte durante la transazione corrente.
ROLLBACK termina la transazione corrente e annulla tutte le modifiche apportate dopo l'operazione ha avuto inizio.
Dopo che l'operazione in corso si è conclusa con un COMMIT o ROLLBACK , la prima istruzione SQL eseguita inizierà automaticamente un'altra transazione.
Ad esempio, i comandi SQL seguenti hanno l'effetto finale di inserimento nella tabella R della tupla (3, 4), ma non (1, 2):
insert into R values (1, 2); rollback; insert into R values (3, 4); commit;
Oracle supporta anche l'opzione AUTOCOMMIT. Con questa opzione è impostata su ON ogni singola istruzione SQL viene trattata come una transazione uno sarà automaticamente impegnata subito dopo viene eseguito. Un utente può modificare l'opzione AUTOCOMMIT digitando
SET AUTOCOMMIT ON
o
SET AUTOCOMMIT OFF
mentre digitando
SHOW ALL
un utente può vedere l'impostazione corrente di tutte le opzioni.
Oracle supporta anche il comando SAVEPOINT <sp_name> che stabilisce un punto di salvataggio denominato <sp_name>, che segna il punto corrente di una transazione. Questo punto di salvataggio può essere utilizzato in combinazione con il comando ROLLBACK per <sp_name> per annullare le parti di una transazione.
Ad esempio, i seguenti comandi hanno l'effetto finale di inserimento nella tabella R tuple (5, 6) e (11, 12), ma non (7, 8) o (9, 10):
insert into R values (5, 6); savepoint my_sp_1; insert into R values (7, 8); savepoint my_sp_2; insert into R values (9, 10); rollback to my_sp_1; insert into R values (11, 12); commit;
Oracle rilascia automaticamente un implicito COMMIT prima e dopo ogni dichiarazione SQL DDL (Data Definition Language) (anche se non riesce).