διαγραφή από rowid oracle (14)

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

Πώς να αφαιρέσετε όλες τις διπλές γραμμές και να αφήσετε μόνο μία από αυτές;

Λύση 1)

διαγραφή από emp όπου το rowid δεν είναι μέσα (επιλέξτε max(rowid) από ομάδα emp ανά empno).

Λύση 2)

διαγραφή από emp όπου rowid in (επιλογή απαλλαγής από (επιλογή rowid rid, row_number() over (διαμέριση κατά σειρά empno κατά empno) rn από emp) όπου rn > 1);

Λύση 3)

Για καλύτερη απόδοση, ορίστε τι έγραψα:
(βλέπε σχέδιο εκτέλεσης)

DELETE FROM your_table WHERE rowid IN (επιλέξτε t1.rowid από your_table t1 ΑΡΙΣΤΕΡΑ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ (ΕΠΙΛΟΓΗ MIN(rowid) ως σειρά, στήλη1, στήλη2, στήλη 3 ΑΠΟ your_table ΟΜΑΔΑ ΑΠΟ στήλη1, στήλη2, στήλη 3) co1 ON (t1. rowid) WHERE co1.rowid IS NULL);

Ελέγξτε τα παρακάτω σενάρια -

Δημιουργία δοκιμής πίνακα (id int,sal int);

εισαγάγετε σε τιμές δοκιμής (1.100); εισαγάγετε σε τιμές δοκιμής (1.100); εισαγάγετε σε τιμές δοκιμής (2.200); εισαγάγετε σε τιμές δοκιμής (2.200); εισαγάγετε σε τιμές δοκιμής (3.300); εισαγάγετε σε τιμές δοκιμής (3.300); διαπράττω;

επιλέξτε * από τη δοκιμή.

Εδώ θα δείτε 6 συμμετοχές.
4.run κάτω από το ερώτημα -

Διαγραφή από τη δοκιμή όπου rowid in (επιλέξτε rowid από (επιλογή σειράς, row_number() πάνω (διαμέριση κατά σειρά αναγνωριστικού ανά sal) dup από τη δοκιμή) όπου dup > 1)

  1. επιλέξτε * από τη δοκιμή.

Θα δείτε ότι οι διπλότυπες καταχωρήσεις έχουν αφαιρεθεί.
Ελπίζω ότι αυτό λύνει το αίτημά σας. Χάρη σε:)

Για να επιλέξετε διπλότυπα, μόνο η μορφή ερωτήματος μπορεί να είναι:

SELECT GroupFunction(στήλη1), GroupFunction(στήλη2),..., COUNT(στήλη1), στήλη1, στήλη2... FROM our_table GROUP BY στήλη1, στήλη2, στήλη3... HAVING COUNT(στήλη1) > 1

Οπότε το σωστό ερώτημα στην άλλη πρόταση είναι:

ΔΙΑΓΡΑΦΗ ΑΠΟ όνομα πίνακα α WHERE a.ROWID > ΟΠΟΙΑΔΗΠΟΤΕ (ΕΠΙΛΟΓΗ β.ROWID ΑΠΟ όνομα πίνακα b WHERE a.όνομα πεδίου = β.όνομα πεδίου ΚΑΙ α.όνομα πεδίου2 = β.όνομα πεδίου2 ΚΑΙ .... ούτω καθεξής.. για να προσδιορίσετε τις διπλότυπες σειρές.. ..)

Αυτό το ερώτημα θα εξοικονομήσει τα μέγιστα παλιό δίσκοστη βάση δεδομένων για τα κριτήρια που επιλέχθηκαν στο WHERE CRAUSE .

Oracle Certified Associate (2008)

Δεν έχω δει απαντήσεις που χρησιμοποιούν κοινές εκφράσεις πίνακα και συναρτήσεις παραθύρου. Είναι αυτό με το οποίο είναι πιο εύκολο να συνεργαστώ.

ΔΙΑΓΡΑΦΗ ΑΠΟ ΤΟΝ Πίνακά σας WHERE ROWID IN (ΜΕ Διπλότυπα AS (SELECT ROWID RID, ROW_NUMBER() ΠΑΝΩ (PARTITION BY First_Name, Last_Name, Birth_Date) AS RN SUM(1) OVER(PARTITION BY First_Name, RBOWEDYUNDR, Last_Name) ΠΡΟΗΓΟΥΜΕΝΟ ΚΑΙ ΑΠΕΡΙΟΡΙΣΜΕΝΟ ΑΚΟΛΟΥΘΕΙ) ΩΣ CNT FROM Your Table ΟΠΟΥ Load_Date IS NULL) ΕΠΙΛΕΞΤΕ ΑΠΑΛΛΑΓΗ ΑΠΟ διπλότυπα WHERE RN > 1);

Πράγματα που πρέπει να σημειώσετε:

1) Ελέγχουμε μόνο για διπλά πεδία σε μια ενότητα.

2) Εάν έχετε λόγο να επιλέξετε ένα αντίγραφο έναντι των άλλων, μπορείτε να χρησιμοποιήσετε τη σειρά κατά ρήτρα έτσι ώστε αυτή η σειρά να έχει row_number() = 1

3) Μπορείτε να αλλάξετε τον διπλότυπο αριθμό που έχει αποθηκευτεί αλλάζοντας την ρήτρα τελικού όπου σε "Where RN>N" με N>=1 (νόμιζα ότι το N=0 θα αφαιρούσε όλες τις σειρές με διπλότυπα, αλλά απλώς θα αφαιρούσε όλες τις σειρές).

4) Προστέθηκε ένα πεδίο ενότητας άθροισης, ένα ερώτημα CTE που θα επισημαίνει κάθε πτέρυγα με τους αριθμούς σειρών στην ομάδα. Επομένως, για να επιλέξετε σειρές με διπλότυπα, συμπεριλαμβανομένου του πρώτου στοιχείου, χρησιμοποιήστε το "WHERE cnt > 1".

1. απόφαση

Διαγραφή από emp όπου το rowid δεν είναι μέσα (επιλέξτε max(rowid) από ομάδα emp ανά empno).

2. λύση

Διαγραφή από emp όπου rowid in (επιλογή απαλλαγής από (επιλογή rowid rid, row_number() over(διαμέριση κατά σειρά empno κατά empno) rn από emp) όπου rn > 1);

3.λύση

Διαγραφή από emp e1 όπου το rowid δεν είναι μέσα (επιλέξτε max(rowid) από emp e2 όπου e1.empno = e2.empno);

4. λύση

Διαγραφή από emp όπου rowid in (επιλογή απαλλαγής από (select rowid rid, dense_rank() over(διαμέριση κατά σειρά empno ανά σειρά) rn από emp) όπου rn > 1);

Δημιουργία ή αντικατάσταση της διαδικασίας delete_duplicate_enq καθώς ο δρομέας c1 επιλέγεται * από την ερώτηση. ξεκινήστε για z στον βρόχο c1 διαγράψτε το ερώτημα όπου enquiry.enquiryno = z.enquiryno και rowid > any (επιλέξτε rowid από την έρευνα όπου enquiry.enquiryno = z.enquiryno); τελικός βρόχος? τέλος delete_duplicate_enq;

Δημιουργία πίνακα abcd(αριθμός αναγνωριστικού(10),όνομα varchar2(20)) εισαγωγή σε τιμές abcd(1"abc") εισαγωγή σε τιμές abcd(2"pqr") εισαγωγή σε τιμές abcd(3,"xyz") εισαγωγή σε τιμές abcd(1"abc") insert into abcd values(2,"pqr") insert into abcd values(3,"xyz") επιλέξτε * από το abcd id Όνομα 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz Διαγράψτε τη διπλότυπη εγγραφή αλλά διατηρήστε τη διακριτή εγγραφή στον πίνακα DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id); εκτελέστε το παραπάνω ερώτημα 3 σειρές διαγραφή επιλέξτε * από abcd id Όνομα 1 abc 2 pqr 3 xyz

Διαγραφή καταχωρήσεων

Η δήλωση DELETE χρησιμοποιείται για την αφαίρεση εγγραφών από έναν πίνακα:

ΔΙΑΓΡΑΦΗ ΑΠΟ όνομα πίνακα WHERE συνθήκη.

Αυτή η δήλωση αφαιρεί από τον καθορισμένο πίνακα εγγραφές (όχι μεμονωμένες τιμές στηλών) που ικανοποιούν την καθορισμένη συνθήκη. Η συνθήκη είναι μια δυαδική έκφραση, διάφορα σχέδιαπου έχουν καλυφθεί σε προηγούμενα εργαστήρια.

Το ακόλουθο ερώτημα αφαιρεί εγγραφές από τον πίνακα Πελάτης στον οποίο η τιμή της στήλης LName είναι "Ivanov":

ΔΙΑΓΡΑΦΗ ΑΠΟ Πελάτη

WHERE LName = "Ivanov"

Εάν ο πίνακας περιέχει πληροφορίες για πολλούς πελάτες με το επώνυμο Ivanov, τότε θα διαγραφούν όλοι.

Η πρόταση WHERE μπορεί να περιέχει ένα υποερώτημα για την επιλογή δεδομένων (η δήλωση SELECT). Τα δευτερεύοντα ερωτήματα σε μια δήλωση DELETE λειτουργούν ακριβώς με τον ίδιο τρόπο που λειτουργούν σε μια δήλωση SELECT. Το ακόλουθο ερώτημα καταργεί όλους τους πελάτες από την πόλη της Μόσχας, με το μοναδικό αναγνωριστικό της πόλης να επιστρέφεται χρησιμοποιώντας ένα δευτερεύον ερώτημα.

ΔΙΑΓΡΑΦΗ ΑΠΟ Πελάτη

WHERE IdCity IN (ΕΠΙΛΟΓΗ IdCity FROM City WHERE CityName = "Μόσχα")

Το Transact-SQL επεκτείνει την τυπική SQL επιτρέποντάς σας να χρησιμοποιήσετε έναν άλλο όρο FROM σε μια πρόταση DELETE. Αυτή η επέκταση ένωσης μπορεί να χρησιμοποιηθεί αντί για ένα δευτερεύον ερώτημα στον όρο WHERE για να καθορίσετε τις σειρές που θα διαγραφούν. Σας επιτρέπει να ορίσετε δεδομένα από το δεύτερο FROM και να αφαιρέσετε τις αντίστοιχες σειρές από τον πίνακα στην πρώτη πρόταση FROM. Συγκεκριμένα, το προηγούμενο ερώτημα θα μπορούσε να ξαναγραφτεί ως εξής

ΔΙΑΓΡΑΦΗ ΑΠΟ Πελάτη

ΑΠΟ Πελάτη k ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ

Η λειτουργία της διαγραφής εγγραφών από έναν πίνακα είναι επικίνδυνη με την έννοια ότι σχετίζεται με τον κίνδυνο μη αναστρέψιμης απώλειας δεδομένων σε περίπτωση σημασιολογικών (αλλά όχι συντακτικών) σφαλμάτων στη διατύπωση της δήλωσης SQL. Για να αποφύγετε προβλήματα, πριν διαγράψετε εγγραφές, συνιστάται να εκτελέσετε πρώτα το κατάλληλο ερώτημα επιλογής για να δείτε ποιες εγγραφές θα διαγραφούν. Έτσι, για παράδειγμα, πριν από την εκτέλεση του ερωτήματος διαγραφής που συζητήθηκε προηγουμένως, δεν θα ήταν κακό να εκτελέσετε το αντίστοιχο ερώτημα επιλογής.

ΕΠΙΛΕΓΩ*

ΑΠΟ Πελάτη k ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ

Πόλη c ON k.IdCity = c.IdCity ΚΑΙ c.CityName = "Μόσχα"

Για να αφαιρέσετε όλες τις εγγραφές από έναν πίνακα, απλώς χρησιμοποιήστε την πρόταση DELETE χωρίς λέξη-κλειδίΟΠΟΥ. Ταυτόχρονα, ο ίδιος ο πίνακας με όλες τις στήλες που ορίζονται σε αυτόν αποθηκεύεται και είναι έτοιμος για εισαγωγή νέων εγγραφών. Για παράδειγμα, το ακόλουθο ερώτημα καταργεί εγγραφές για όλα τα προϊόντα.

ΔΙΑΓΡΑΦΗ ΑΠΟ Προϊόν

Εργασία για ανεξάρτητη εργασία:Διατύπωση σε Γλώσσα SQLένα αίτημα διαγραφής όλων των παραγγελιών που δεν περιέχουν κανένα αγαθό (δηλαδή όλες τις κενές παραγγελίες).



Κατάργηση διπλότυπων σειρών από έναν πίνακα στο Oracle (14)

Λύση 1)

διαγραφή από emp όπου το rowid δεν είναι μέσα (επιλέξτε max(rowid) από ομάδα emp ανά empno).

Λύση 2)

διαγραφή από emp όπου rowid in (επιλογή απαλλαγής από (επιλογή rowid rid, row_number() over (διαμέριση κατά σειρά empno κατά empno) rn από emp) όπου rn > 1);

Λύση 3)

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

Πώς να αφαιρέσετε όλες τις διπλές γραμμές και να αφήσετε μόνο μία από αυτές;

Για καλύτερη απόδοση, ορίστε τι έγραψα:
(βλέπε σχέδιο εκτέλεσης)

DELETE FROM your_table WHERE rowid IN (επιλέξτε t1.rowid από your_table t1 ΑΡΙΣΤΕΡΑ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ (ΕΠΙΛΟΓΗ MIN(rowid) ως σειρά, στήλη1, στήλη2, στήλη 3 ΑΠΟ your_table ΟΜΑΔΑ ΑΠΟ στήλη1, στήλη2, στήλη 3) co1 ON (t1. rowid) WHERE co1.rowid IS NULL);

Ελέγξτε τα παρακάτω σενάρια -

Δημιουργία δοκιμής πίνακα (id int,sal int);

εισαγάγετε σε τιμές δοκιμής (1.100); εισαγάγετε σε τιμές δοκιμής (1.100); εισαγάγετε σε τιμές δοκιμής (2.200); εισαγάγετε σε τιμές δοκιμής (2.200); εισαγάγετε σε τιμές δοκιμής (3.300); εισαγάγετε σε τιμές δοκιμής (3.300); διαπράττω;

επιλέξτε * από τη δοκιμή.

Εδώ θα δείτε 6 συμμετοχές.
4.run κάτω από το ερώτημα -

Διαγραφή από τη δοκιμή όπου rowid in (επιλέξτε rowid από (επιλογή σειράς, row_number() πάνω (διαμέριση κατά σειρά αναγνωριστικού ανά sal) dup από τη δοκιμή) όπου dup > 1)

  1. επιλέξτε * από τη δοκιμή.

Θα δείτε ότι οι διπλότυπες καταχωρήσεις έχουν αφαιρεθεί.
Ελπίζω ότι αυτό λύνει το αίτημά σας. Χάρη σε:)

Για να επιλέξετε διπλότυπα, μόνο η μορφή ερωτήματος μπορεί να είναι:

SELECT GroupFunction(στήλη1), GroupFunction(στήλη2),..., COUNT(στήλη1), στήλη1, στήλη2... FROM our_table GROUP BY στήλη1, στήλη2, στήλη3... HAVING COUNT(στήλη1) > 1

Οπότε το σωστό ερώτημα στην άλλη πρόταση είναι:

ΔΙΑΓΡΑΦΗ ΑΠΟ όνομα πίνακα α WHERE a.ROWID > ΟΠΟΙΑΔΗΠΟΤΕ (ΕΠΙΛΟΓΗ β.ROWID ΑΠΟ όνομα πίνακα b WHERE a.όνομα πεδίου = β.όνομα πεδίου ΚΑΙ α.όνομα πεδίου2 = β.όνομα πεδίου2 ΚΑΙ .... ούτω καθεξής.. για να προσδιορίσετε τις διπλότυπες σειρές.. ..)

Αυτό το ερώτημα θα αποθηκεύσει την παλαιότερη καταχώρηση στη βάση δεδομένων για τα κριτήρια που επιλέχθηκαν στην ΠΡΟΤΑΣΗ WHERE.

Oracle Certified Associate (2008)

Δεν έχω δει απαντήσεις που χρησιμοποιούν κοινές εκφράσεις πίνακα και συναρτήσεις παραθύρου. Είναι αυτό με το οποίο είναι πιο εύκολο να συνεργαστώ.

ΔΙΑΓΡΑΦΗ ΑΠΟ ΤΟΝ Πίνακά σας WHERE ROWID IN (ΜΕ Διπλότυπα AS (SELECT ROWID RID, ROW_NUMBER() ΠΑΝΩ (PARTITION BY First_Name, Last_Name, Birth_Date) AS RN SUM(1) OVER(PARTITION BY First_Name, RBOWEDYUNDR, Last_Name) ΠΡΟΗΓΟΥΜΕΝΟ ΚΑΙ ΑΠΕΡΙΟΡΙΣΜΕΝΟ ΑΚΟΛΟΥΘΕΙ) ΩΣ CNT FROM Your Table ΟΠΟΥ Load_Date IS NULL) ΕΠΙΛΕΞΤΕ ΑΠΑΛΛΑΓΗ ΑΠΟ διπλότυπα WHERE RN > 1);

Πράγματα που πρέπει να σημειώσετε:

1) Ελέγχουμε μόνο για διπλά πεδία σε μια ενότητα.

2) Εάν έχετε λόγο να επιλέξετε ένα αντίγραφο έναντι των άλλων, μπορείτε να χρησιμοποιήσετε τη σειρά κατά ρήτρα έτσι ώστε αυτή η σειρά να έχει row_number() = 1

3) Μπορείτε να αλλάξετε τον διπλότυπο αριθμό που έχει αποθηκευτεί αλλάζοντας την ρήτρα τελικού όπου σε "Where RN>N" με N>=1 (νόμιζα ότι το N=0 θα αφαιρούσε όλες τις σειρές με διπλότυπα, αλλά απλώς θα αφαιρούσε όλες τις σειρές).

4) Προστέθηκε ένα πεδίο ενότητας άθροισης, ένα ερώτημα CTE που θα επισημαίνει κάθε πτέρυγα με τους αριθμούς σειρών στην ομάδα. Επομένως, για να επιλέξετε σειρές με διπλότυπα, συμπεριλαμβανομένου του πρώτου στοιχείου, χρησιμοποιήστε το "WHERE cnt > 1".

1. απόφαση

Διαγραφή από emp όπου το rowid δεν είναι μέσα (επιλέξτε max(rowid) από ομάδα emp ανά empno).

2. λύση

Διαγραφή από emp όπου rowid in (επιλογή απαλλαγής από (επιλογή rowid rid, row_number() over(διαμέριση κατά σειρά empno κατά empno) rn από emp) όπου rn > 1);

3.λύση

Διαγραφή από emp e1 όπου το rowid δεν είναι μέσα (επιλέξτε max(rowid) από emp e2 όπου e1.empno = e2.empno);

4. λύση

Διαγραφή από emp όπου rowid in (επιλογή απαλλαγής από (select rowid rid, dense_rank() over(διαμέριση κατά σειρά empno ανά σειρά) rn από emp) όπου rn > 1);

Δημιουργία ή αντικατάσταση της διαδικασίας delete_duplicate_enq καθώς ο δρομέας c1 επιλέγεται * από την ερώτηση. ξεκινήστε για z στον βρόχο c1 διαγράψτε το ερώτημα όπου enquiry.enquiryno = z.enquiryno και rowid > any (επιλέξτε rowid από την έρευνα όπου enquiry.enquiryno = z.enquiryno); τελικός βρόχος? τέλος delete_duplicate_enq;

Δημιουργία πίνακα abcd(αριθμός αναγνωριστικού(10),όνομα varchar2(20)) εισαγωγή σε τιμές abcd(1"abc") εισαγωγή σε τιμές abcd(2"pqr") εισαγωγή σε τιμές abcd(3,"xyz") εισαγωγή σε τιμές abcd(1"abc") insert into abcd values(2,"pqr") insert into abcd values(3,"xyz") επιλέξτε * από το abcd id Όνομα 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz Διαγράψτε τη διπλότυπη εγγραφή αλλά διατηρήστε τη διακριτή εγγραφή στον πίνακα DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id); εκτελέστε το παραπάνω ερώτημα 3 σειρές διαγραφή επιλέξτε * από abcd id Όνομα 1 abc 2 pqr 3 xyz

Η πλατφόρμα Oracle σάς επιτρέπει να διαγράφετε σειρές από πίνακες, προβολές, υλοποιημένες προβολές, ένθετα υποερωτήματα και διαμερισμένες προβολές και πίνακες ως εξής.

(όνομα_πίνακα | ΜΟΝΟ (όνομα_πίνακα)) [ψευδώνυμο] [(PARTITION (όνομα_διαμερίσματος) SUBPARTITION

(όνομα_υποενότητας))] | (υποερώτημα )]) | ΠΙΝΑΚΑΣ (collection_expression) [(+)])

μεταβλητή INTO [,…]]

Οι παράμετροι φαίνονται παρακάτω.

table_name [ψευδώνυμο]

Καθορίζει τον πίνακα, την προβολή, την υλοποιημένη προβολή ή τον διαχωρισμένο πίνακα ή την προβολή από την οποία θα διαγραφούν οι εγγραφές. Προαιρετικά, μπορείτε να προσθέσετε ένα πρόθεμα για το όνομα_τραπέζης με ένα σχήμα ή να καθορίσετε μια σύνδεση βάσης δεδομένων μετά το όνομα_του πίνακα. Διαφορετικά η Oracle θα χρησιμοποιήσει το τρέχον σχήμα και τοπικός διακομιστήςΒάση δεδομένων. Προαιρετικά, μπορείτε να δώσετε στο table_name ένα ψευδώνυμο. Το ψευδώνυμο απαιτείται εάν ο πίνακας αναφέρεται σε ένα χαρακτηριστικό ή μια μέθοδο ενός τύπου αντικειμένου.

Όνομα διαμερίσματος PARTITION

Η λειτουργία διαγραφής εφαρμόζεται στο καθορισμένο διαμέρισμα και όχι σε ολόκληρο τον πίνακα. Κατά τη διαγραφή από έναν πίνακα διαμερισμάτων, δεν είναι απαραίτητο να προσδιορίσετε το όνομα του διαμερίσματος, αλλά σε πολλές περιπτώσεις βοηθά στη μείωση της πολυπλοκότητας της ρήτρας WHERE.

SUBPARTITION (όνομα_υποτμήματος)

Η διαγραφή εφαρμόζεται στο καθορισμένο δευτερεύον κλειδί και όχι σε ολόκληρο τον πίνακα.

(υποερώτημα )])

Καθορίζει ότι ο στόχος της λειτουργίας διαγραφής είναι ένα ένθετο υποερώτημα και όχι ένας πίνακας, μια προβολή ή άλλο αντικείμενο βάσης δεδομένων. Οι παράμετροι αυτής της πρότασης είναι οι εξής.

υποερώτημα

Καθορίζεται μια δήλωση SELECT, η οποία είναι ένα δευτερεύον ερώτημα. Μπορείτε να δημιουργήσετε οποιοδήποτε τυπικό υποερώτημα, αλλά δεν μπορεί να περιέχει προτάσεις ORDER BY.

ΜΕ ΔΙΑΒΑΣΜΑ ΜΟΝΟ

Υποδεικνύει ότι το δευτερεύον ερώτημα δεν μπορεί να ενημερωθεί.

ΜΕ ΕΠΙΛΟΓΗ ΕΛΕΓΧΟΥ

Η Oracle θα απορρίψει τυχόν αλλαγές στον απομακρυσμένο πίνακα που δεν είναι ορατές στο σύνολο αποτελεσμάτων του υποερωτήματος.

CONSTRAINT constraint_name

Το σύστημα Oracle θα περιορίσει τις αλλαγές που κάνετε με βάση τον περιορισμό που ονομάζεται constraint_name.

ΠΙΝΑΚΑΣ (έκφραση Για κύλιση) [(+)]

Το σύστημα Oracle θα αντιμετωπίσει το rollexpression ως πίνακα, αν και θα μπορούσε στην πραγματικότητα να είναι ένα υποερώτημα, μια συνάρτηση ή άλλος κατασκευαστής συλλογής. Σε κάθε περίπτωση, η τιμή που επιστρέφεται από την έκφραση For Rollection πρέπει να είναι ένθετος πίνακας ή VARRAY.

ΕΠΙΣΤΡΟΦΗ έκφραση

Ανακτά τις σειρές που επηρεάζονται από την εντολή όπου η εντολή DELETE θα επέστρεφε κανονικά μόνο μια καταμέτρηση διαγραμμένες σειρές. Ο όρος RETURNING μπορεί να χρησιμοποιηθεί εάν ο στόχος της εντολής είναι ένας πίνακας, μια υλοποιημένη προβολή ή μια προβολή σε έναν μόνο βασικό πίνακα. Εάν η ρήτρα χρησιμοποιείται κατά τη διαγραφή μιας μεμονωμένης γραμμής, τότε οι τιμές από τη διαγραμμένη σειρά που καθορίζονται από την έκφραση αποθηκεύονται σε μεταβλητές PL/SQL και μεταβλητές δέσμευσης. Εάν η ρήτρα χρησιμοποιείται κατά τη διαγραφή πολλών σειρών, τότε οι τιμές από τις διαγραμμένες σειρές που καθορίζονται από την έκφραση αποθηκεύονται στους πίνακες δέσμευσης.

μεταβλητή INTO

Καθορίζονται μεταβλητές στις οποίες εγγράφονται οι τιμές που επιστράφηκαν ως αποτέλεσμα της ρήτρας RETURNING.

Κατά την εκτέλεση μιας δήλωσης DELETE, η Oracle επιστρέφει τον χώρο που ελευθερώθηκε στον πίνακα (ή στον υποκείμενο πίνακα προβολής) πίσω στον πίνακα ή στο ευρετήριο όπου ήταν αποθηκευμένα τα δεδομένα.

Εάν αφαιρεθούν δεδομένα από μια προβολή, η προβολή δεν μπορεί να περιέχει λειτουργίες συνόλου, τη λέξη-κλειδί DISTINCT, συνδέσεις, μια συγκεντρωτική συνάρτηση, μια αναλυτική συνάρτηση, υποερωτήματα SELECT, μια ρήτρα GROUP BY, μια ORDER BY clause, μια CONNECT BY ή μια START ΜΕ ρήτρα.

Ακολουθεί ένα παράδειγμα όπου διαγράφουμε δεδομένα από έναν απομακρυσμένο διακομιστή.

ΔΙΑΓΡΑΦΗ ΑΠΟ scott [email προστατευμένο];

Στο παρακάτω παράδειγμα

διαγράφουμε δεδομένα από τον παράγωγο πίνακα που καθορίζεται στην έκφραση για τη συλλογή.

ΔΙΑΓΡΑΦΗ ΠΙΝΑΚΑ (ΕΠΙΛΟΓΗ ονόματος επαφής ΑΠΟ πελάτες

με WHERE c.customerid="BOTTM") s WHERE s. περιοχή ΕΙΝΑΙ ΜΗΧΑΝΗ Ή s.country="MEXICO";

Και εδώ είναι ένα παράδειγμα διαγραφής από την ενότητα.

DELETE FROM sales PARTITION (sales_q3_1997) WHERE ποσό > 10000;

Τέλος, στο παρακάτω παράδειγμα, χρησιμοποιούμε τον όρο RETURNING για να δούμε τις διαγραμμένες τιμές.

ΔΙΑΓΡΑΦΗ ΑΠΟ υπάλληλο ΟΠΟΥ job_id=13

AND hire_date + TO_YMINTERVAL("01-06") =.

Το προηγούμενο παράδειγμα αφαιρεί εγγραφές από τον πίνακα υπαλλήλων και επιστρέφει τις τιμές j obi vl σε μια προκαθορισμένη μεταβλητή: intol.