4-53: Βάσεις Δεδομένων

Oracle Version 8 SQL

Παρακάτω περιγράφονται κάποιες διαφορές της Oracle από την standard SQL.


Βασικά Χρακτηριστικά της SQL


Η Oracle δεν υποστηρίζει τη χρήση του AS στο FROM, κανείς όμως μπορεί να προσδιορίσει μεταβλητές πλειάδων χωρίς το AS:
    from Relation1 u, Relation2 v
Η Oracle υποστηρίζει τη χρήση του AS στο SELECT, αν και η χρήση του είναι προαιρετική.


Ο τελεστής της διαφοράς συνόλων στην Oracle ονομάζεται MINUS αντί για EXCEPT. Δεν υπάρχει αντίστοιχο του τελεστή EXCEPT ALL ούτε του τελεστή INTERSECT ALL. Αντίθετα ο τελεστής UNION ALL υποστηρίζεται.


Στην Oracle, στην περίπτωση που δυο γνωρίσματα σε διαφορετικές σχέσεις έχουν το ίδιο όνομα, πρέπει να προσδιορίζουμε σε ποιά σχέση αναφέρεται. Για παράδειγμα, έστω ότι έχουμε τις σχέσεις R(A,B) και S(B,C). Η παρακάτω ερώτηση δε δουλεύει στην Oracle, αν και δεν υπάρχει ασάφεια αφού το B ισούται με S.B από το WHERE:
    select B from R, S where R.B = S.B;    /* ΜΗ ΑΠΟΔΕΚΤΟ! */
Το σωστό είναι:
    select R.B from R, S where R.B = S.B;

Στη Oracle, ο λογικός τελεστής άρνησης (NOT) πρέπει να προηγείται της λογικής έκφρασης και όχι του τελεστή σύγκρισης. Για παράδειγμα, η συνθήκη "NOT A = ANY (<subquery>)" είναι μια νόμιμη συνθήκη του WHERE, αλλά το "A NOT = ANY (<subquery>)" δεν είναι. (Σημειώστε ότι το "A <> ANY (<subquery>)" είναι επίσης μια νόμιμη συνθήκη αλλά σημαίνει κάτι άλλο.) Υπάρχει μια εξαίρεση σε αυτόν τον κανόνα. Μπορεί κανείς να χρησιμοποιήσει είτε το "NOT A IN (<subquery>)" είτε "A NOT IN (<subquery>)".


Η Oracle δεν υποστηρίζει JOIN ή OUTER JOIN εκφράσεις, είτε μόνες τους είτε στο FROM. Αντίθετα, οι εξωτερικές συνενώσεις εκφράζονται μέσω ενός ειδικού τελεστή "(+)" στο WHERE clauses. Για παράδειγμα, έστω ότι έχουμε δύο σχέσεις R(A, B) and S(C, D). Τότε,
    R left outer join S on R.B = S.C;
    R right outer join S on R.B = S.C;
μπορεί να γραφεί ως:
    select * from R, S where R.B = S.C(+);
    select * from R, S where R.B(+) = S.C;
Το "(+)" δίπλα από μια στήλη (γνώρισμα) σημαίνει ότι αυτή η στήλη θα συμπληρωθεί με τιμές NULL στο αποτέλεσμα της εξωτερικής συνένωσης. Δυστυχώς, δε μπορεί το "(+)" δε μπορεί να χρησιμοποιηθεί και στις δυο πλευρες της ισότητας για να δώσει μια πλήρη εξωτερική συνένωση. Επίσης, δε μπορεί κανείς να εκτελέσει εξωτερική συνένωση του ίδιου πίνακα με παραπάνω από έναν άλλους πίνακες σε μια SELECT ερώτηση.


Η εντολή ALTER TABLE της Oracle δεν επιτρέπει τη διαγραφή γνωρισμάτων αλλά μόνο την προσθήκη νέων.


Τύποι Δεδομένων


Ο τύπος BIT δεν υποστηρίζεται. Υπάρχει ο τύπος BOOLEAN στην PL/SQL (see Using Oracle PL/SQL for details), αλλά δε μπορεί να χρησιμοποιηθεί ως πεδίο ορισμού γνωρίσματος.


Πεδίο (δηλ., ονόματα τύπων) δεν υποστηρίζονται.


Οι ημερομηνίες και η ώρα υποστηρίζονται διαφορετικά. Κοιτάξτε στο Ωρα και Ημερομηνίες στην Oracle.


Ευρετήρια

Θα προστεθεί αργότερα.


Όψεις


Η Oracle υποστηρίζει όψεις όπως ορίζονται στην SQL2. Για να δείτε ποιες όψεις έχετε δημιουργήσει χρησιμοποιήστε το:
    select view_name from user_views;


Περιορισμοί


Για να δείτε ποιοί περιορισμοί έχουν οριστεί χρησιμοποιήστε το:
    select constraint_name from user_constraints;

Η Oracle υποστηρίζει περιορισμούς κλειδιού όπως καθορίζεται από την SQL2. Για κάθε σχέση (πίνακα) μπορεί να υπάρχει μόνο ένας ορισμός PRIMARY KEY, αλλά μπορεί να υπάρχουν πολλοί ορισμοί UNIQUE. Κάθε ορισμός PRIMARY KEYUNIQUE) μπορεί να έχει πολλαπλά γνωσρίσματα, που σημαίνει ότι αυτά τα γνωρίσματα μαζί αποτελούν το πρωτεύον (ή αντίστοιχα το υποψήφιο) κλειδί της σχέσης.


Η Oracle επιτρέπει περιορισμούς ξένου κλειδιού, καθώς και ένα ένα προαιρετικό ON DELETE CASCADE μετά το REFERENCES στον ορισμό της σχέσης. Δεν υποστηρίζει όμως ούτε το ON UPDATE ούτε το SET NULL.


Η Oracle υποστηρίζει και άλλες μορφές περιορισμών σε επίπεδο γνωρίσματος ή πλειάδων αλλά δεν επιτρέπει η συνθήκη του CHECK να χρησιμοποιεί υπο-ερωτήσεις. Έτσι αυτοί οι περιορισμοί μπορεί να αναφέρονται μόνο στα γνωρίσμα ή πλειάδες που εισάγονται ή τpοποποιούνται.


Περιορισμοί πεδίου δεν υποστηρίζονται αφού δεν υποστηρίζονται πεδία.


Γενικοί περιορισμοί της μορφής ASSERTION δεν υποστηρίζονται. Ωστόσο, υποστηρίζεται πεεριορισμοί TRIGGER (Using Oracle PL/SQL).


Στην εντολή ALTER TABLE, η Oracle υποστηρίζει την προσθήκη (ADD) γνωρισμάτων και περιορισμών σχέσεων, την τροποποίηση (MODIFY) ιδιοτήτων γνωρισμάτων και περιορισμών γνωρισμάτων, καθώς και τη διαγραφή (DROP) περιορισμών. Ωστόσο, ένας περιορισμός ορισμένος με CHECK δε μπορεί να τροποιηθεί (MODIFY). Μερικά παραδείγματα:
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;

Η διαγραφή περιορισμών γενικά απαιτεί γνώση των ονοματών τους.


Δοσοληψίες

Θα προστεθεί αργότερα.


Χρονομέτρηση των Εντολών


Η Oracle παρέχει μια εντολή TIMING για τη μέτρηση του χρόνου τρεξίματος μιας εντολής SQL. Για να ενεργοποιήστε αυτή τη δυνατότητα πληκτρολογήστε
set timing on;
Στη συνέχεια, η Oracle θα τυπώσει αυτόματα το χρόνο που πέρασε για κάθε εντολή που θε τρέχετε. Ο χρόνος εκτέλεσης εξαρτάται και από εξωτερικούς παράγοντες όπως το φορτίο του συστήματος. Για να αποενεργοποιήστε το χρονισμό, πληκτρολογήστε:
set timing off;


Μετάφραση από οδηγίες για το μάθημα "Introduction to Databases", Stanford University.