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

mysql cursors


maryfaih

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

Δημοσ.

μπορει καποιος να μου εξιγησει πως χρησιμοποιούμε τους corsors μεσα σε μια stored procedure σε mysql?!?

 

μπορω πχ να γραψω:

 

 

create procedure GAME_GUOTA( IN id_gam INT,IN l INT)

BEGIN

 

DECLARE done INT DEFAULT 0;

DECLARE recource_size INT;

DECLARE curs CURSOR FOR SELECT res_size FROM resource WHERE res_gam_id=id_gam;

 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

 

OPEN curs;

REPEAT

 

FETCH curs INTO recource_size;

 

IF done=0 THEN

BEGIN

IF recource.res_size>l THEN

BEGIN

SELECT a.recource_size,b.recource_size,

FROM resource AS a ,

LEFT JOIN resource AS b WHERE a.recource_size>b.recource_size;

END;

END IF;

END;

END IF;

UNTIL done END REPEAT;

 

CLOSE curs;

 

 

 

οτι κ να αλλαξω πεταει σφαλμα στη γραμμη: IF recource.res_size>l THEN

Δημοσ.

Το μήνυμα που σου βγάζει είναι το παρακάτω ?

unknown table in field list

 

Σωστά σου χτυπάει λάθος γιατί εδώ

IF recource.res_size>l THEN

χρησιμοποιέις πίνακα ο οποίος δεν έχει οριστεί. Δεν υπάρχει πουθενά δηλαδη πιο πάνω το resource. To ότι είναι μέσα στον cursor δεν λέει κάτι αν αυτό σε μπερδεύει.

Δημοσ.
Το μήνυμα που σου βγάζει είναι το παρακάτω ?

 

 

Σωστά σου χτυπάει λάθος γιατί εδώ

IF recource.res_size>l THEN

χρησιμοποιέις πίνακα ο οποίος δεν έχει οριστεί. Δεν υπάρχει πουθενά δηλαδη πιο πάνω το resource. To ότι είναι μέσα στον cursor δεν λέει κάτι αν αυτό σε μπερδεύει.

 

το recource ειναι πινακας που εχω δημιουργησει παραπανω με create table....εφοσον χρισιμοποιουμε select δεν ισχυουνε οι πινακες που εχουμε δημιουργησει στην αρχη???? με την ιδια λογικη θα μου εωγαζε λαθος κ πιο πανω που to εχω βαλει παλι.. :fear:

μου βγαζει error 1064 που αποτι ειδα ειναι κατι για δεσμευμενες λεξεις...

Δημοσ.

Δεν μπορείς να χρησιμοποιήσεις πίνακα της βάσης έτσι χύμα. Πιο πάνω το έχεις χρησιμοποιήσει στην δήλωση του cursor που είναι αποδεκτό. Πρέπει αν αναφέρεσαι είτε με sql statement είτε με cursor. Δηλαδή αν έχω εγώ στην βάση τον πίνακα test δεν μπορώ να πω μέσα στον κώδικα test.column χωρίς κάποιο select ή κάποιο cursor.

Και κάτι άλλο εφόσον έχεις φέρει απο τον cursor την μεταβλητή

FETCH curs INTO recource_size;

γιατί απλά δεν κάνεις

IF recource_size>l THEN
  • Moderators
Δημοσ.

Εγώ πάλι μπερδεύτηκα από τα recource και resource, και τα παράγωγά τους στο script που δίνεις, που χρειάστηκε να διαβάσω πολλές φορές τις γραμμές για να βγάλω συμπέρασμα.

Μήπως θα βοηθούσε και εσένα να έχεις καλύτερη/πιο διακριτή ονοματολογία;

Δημοσ.

τελικα αποτι καταλαβα μαλλον εχω λαθος στη λογικη κ μετα βγαινει λαθος και η υλοποιηση...

 

IF recource_size>l THEN

το εκανα αυτο αλλα δεν δουλεψε παλι..

 

οσο για τα ονοματα ειναι ετσι δωσμενα..

Δημοσ.

Χωρίς να μπω στην λογική του τι θέλεις να κάνεις

 

Το query σου είναι λάθος

 

SELECT a.recource_size,b.recource_size Λάθος ','

FROM resource AS a Λάθος ','

LEFT JOIN resource AS b Λείπει η σύνδεση WHERE a.recource_size>b.recource_size;

 

Δεν έχεις συνδέσει τους πίνακες και στην sql/92 δεν μπορείς να μην τους συνδέσεις. Επίσης έχεις κάποια ',' εκεί που δεν πρέπει

 

Σου δίνω παρακάτω ένα template για το πρόβλημα σου απλά δεν έχω τους πίνακες σου. Προσάρμοσε το λίγο στα μέτρα σου

 

create procedure GAME_GUOTA( IN id_gam INT,IN l INT)

BEGIN

 

DECLARE done INT DEFAULT 0;

DECLARE recource_size INT;

DECLARE curs CURSOR FOR SELECT res_size FROM resource WHERE res_gam_id=id_gam;

 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

 

OPEN curs;

 

REPEAT

FETCH curs INTO recource_size;

IF NOT done THEN

BEGIN -- Αυτο το begin δεν νομίζω ότι χρειάζεται απλά δεν στο πείραξα

IF recource_size>l THEN

BEGIN -- Αυτο το begin δεν νομίζω ότι χρειάζεται απλά δεν στο πείραξα

TO SELECT ΣΟΥ ΕΔΩ

END;

END IF;

END;

END IF;

UNTIL done END REPEAT;

CLOSE curs;

END;

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

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

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