Προς το περιεχόμενο

SQL Cursors & CONTINUE HANDLER


delfini69

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα!

Βασικά έχω κάποιες απορίες σχετικά με τους κέρσορες και την continue handler..

Αρχιζοντας με τους κέρσορες. Θέλω να ρωτήσω, καλώντας την fetch επιστρέφεται κάθε φορά η επόμενη εγγραφή του πίνακα που έχει δηλωθεί στον κέρσορα;;;μέχρις ότου τελειώσουν οι εγγραφες και επιστρέψει κενό;;;;

 

Ακόμα έχω δει σε κώδικα sql αυτή την εντολή:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET @not_found = 1;

Μπορεί κάποιος να μου εξηγήσει τι ακριβώς ελέγχει αυτή η εντολή;;;;;;

 

 

Ισως οι αποροίες μου είναι λίγο χαζές.....:rolleyes:

 

Ευχαριστώ εκ των πρωτέρων...

Δημοσ.
...Βασικά έχω κάποιες απορίες σχετικά με τους κέρσορες και την continue handler..

βρε μια μανία με την "sql" και τους κέρσορες!!!..... :mad:

δεν μπορώ να καταλάβω γιατί 9 στους 10 που κάνουν ερώτηση σχετική με βάσεις δεδομένων, υποθέτουν οτι όλος ο κόσμος δουλεύει την ίδια Βάση, και μπαίνουν κατευθείαν στο θέμα. Σαν να ρωτάω: "παιδιά, οταν ο διαιτιτής σφυράει 2 φορές τι εννοεί;" ώπα! μισό μεγαλε! που σφυράει; στο ποδόσφαιρο, το μπάσκετ; το ράγκμπι;

μια διευκρίνιση δεν βλάπτει : Mysql ? Oracle ? Ms Sql ? άλλη rdbms ?

 

 

ok... φτιάχτηκα :-) πάμε στη MySQL :

 

 

 

 

 

 

 

 

 

 

 

 

 

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

αν και δεν εχω ασχοληθεί πολύ μαζί της, στη MySQL (γιατι άλλες rdbms μπορει να συμπεριφέρονται διαφορετικά),

οταν τελειώσουν οι εγγραφές (ή εξαρχής δεν βρει καμία ,γιατι ο πινακας ειναι αδειος ή καμια δεν ταιριάζει στο WHERE σου),

 

πετάει ενα Σφάλμα τύπου "NOT FOUND"

(ή να το πώ αλλιώς: ενα SQLSTATE με τιμή 02000 )

 

αν δεν έχεις προβλέψει τι θα γίνει σε αυτη την περίπτωση, το πρόγραμμα θα τερματιστεί εκει, αναφέροντας τον κωδικό λαθους του (πχ. 02000).

επειδή το NOT FOUND ειναι η πιό συνηθισμένη κατάσταση στα select, χρειάζεσαι τα HANDLER's οπως παρακάτω:

 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET @not_found = 1;

Μπορεί κάποιος να μου εξηγήσει τι ακριβώς ελέγχει αυτή η εντολή;;;;;;

η συγκεκριμένη γραμμή κωδικα, δεν ελέγχει.

Δηλώνει (DECLARE).

δηλώνει εναν HANDLER (ας πουμε "χειριστή"),

για την κατάσταση "NOT FOUND"

και λέει, οτι αν συμβεί αυτό (το NOT FOUND), να δώσει την τιμή 1 στην μεταβλητή @not_found

 

 

ολοκληρωμένο παράδειγμα :

>
CREATE PROCEDURE curdemo()
BEGIN
 DECLARE done INT DEFAULT 0;
 DECLARE c INT;
 DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
 
 [b]DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;[/b]
 # οταν τελειωσουν οι εγγραφες αλλαξε την τιμη του done

 OPEN cur2;

 REPEAT
   FETCH cur2 INTO c;  # σε αυτο το σημειο δουλευει ο handler
   
   IF NOT done THEN         # τα παρακάτω να εκτελεστούν αν done=0
              IF c >= 100 THEN
                            INSERT INTO test.t3 VALUES (c);
              END IF;
   END IF;

 UNTIL done END REPEAT;   # αν done=1 βγες έξω απο το repeat block

 CLOSE cur2;
END

αν δεν υπήρχε handler, το προγραμμα (υποθέτω, δεν το δοκιμασα), θα τερμάτιζε, μετά το " FETCH cur2 INTO c " χωρις να εκτελεστούν οι επόμενες εντολές (εδώ το : " CLOSE cur2; " .....)

 

 

 

καμιά απορία δεν ειναι χαζή.

 

MySQL 6.0 Reference Manual :: 18 Stored Procedures and Functions :: 18.2 Stored Routine Syntax :: 18.2.9 Cursors

 

MySQL 6.0 Reference Manual :: 18 Stored Procedures and Functions :: 18.2 Stored Routine Syntax :: 18.2.8 Conditions and Handlers :: 18.2.8.2 DECLARE Handlers

Δημοσ.

Thanks φιλέ!! Σωστά μάντεψες το θέμα μου είναι πάνω στη My sql... Πολύ χρήσιμη η βοήθειά σου!!

Χαζές ερωτήσεις από την άποψη ότι θα μπορούσα να το ψάξω λίγο παραπάνω πρίν κάνω το post....Απλά χάθηκα στο ψάξιμο και ήρθε η ώρα της υλοποίησης...!

Ευχαριστώ καιπάλι!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...