maryfaih Δημοσ. 25 Ιανουαρίου 2010 Δημοσ. 25 Ιανουαρίου 2010 μπορει καποιος να μου εξιγησει πως χρησιμοποιούμε τους 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
Aztec Δημοσ. 25 Ιανουαρίου 2010 Δημοσ. 25 Ιανουαρίου 2010 Το μήνυμα που σου βγάζει είναι το παρακάτω ? unknown table in field list Σωστά σου χτυπάει λάθος γιατί εδώ IF recource.res_size>l THEN χρησιμοποιέις πίνακα ο οποίος δεν έχει οριστεί. Δεν υπάρχει πουθενά δηλαδη πιο πάνω το resource. To ότι είναι μέσα στον cursor δεν λέει κάτι αν αυτό σε μπερδεύει.
maryfaih Δημοσ. 26 Ιανουαρίου 2010 Μέλος Δημοσ. 26 Ιανουαρίου 2010 Το μήνυμα που σου βγάζει είναι το παρακάτω ? Σωστά σου χτυπάει λάθος γιατί εδώ IF recource.res_size>l THEN χρησιμοποιέις πίνακα ο οποίος δεν έχει οριστεί. Δεν υπάρχει πουθενά δηλαδη πιο πάνω το resource. To ότι είναι μέσα στον cursor δεν λέει κάτι αν αυτό σε μπερδεύει. το recource ειναι πινακας που εχω δημιουργησει παραπανω με create table....εφοσον χρισιμοποιουμε select δεν ισχυουνε οι πινακες που εχουμε δημιουργησει στην αρχη???? με την ιδια λογικη θα μου εωγαζε λαθος κ πιο πανω που to εχω βαλει παλι.. μου βγαζει error 1064 που αποτι ειδα ειναι κατι για δεσμευμενες λεξεις...
Aztec Δημοσ. 26 Ιανουαρίου 2010 Δημοσ. 26 Ιανουαρίου 2010 Δεν μπορείς να χρησιμοποιήσεις πίνακα της βάσης έτσι χύμα. Πιο πάνω το έχεις χρησιμοποιήσει στην δήλωση του cursor που είναι αποδεκτό. Πρέπει αν αναφέρεσαι είτε με sql statement είτε με cursor. Δηλαδή αν έχω εγώ στην βάση τον πίνακα test δεν μπορώ να πω μέσα στον κώδικα test.column χωρίς κάποιο select ή κάποιο cursor. Και κάτι άλλο εφόσον έχεις φέρει απο τον cursor την μεταβλητή FETCH curs INTO recource_size; γιατί απλά δεν κάνεις IF recource_size>l THEN
Moderators Praetorian Δημοσ. 26 Ιανουαρίου 2010 Moderators Δημοσ. 26 Ιανουαρίου 2010 Εγώ πάλι μπερδεύτηκα από τα recource και resource, και τα παράγωγά τους στο script που δίνεις, που χρειάστηκε να διαβάσω πολλές φορές τις γραμμές για να βγάλω συμπέρασμα. Μήπως θα βοηθούσε και εσένα να έχεις καλύτερη/πιο διακριτή ονοματολογία;
maryfaih Δημοσ. 27 Ιανουαρίου 2010 Μέλος Δημοσ. 27 Ιανουαρίου 2010 τελικα αποτι καταλαβα μαλλον εχω λαθος στη λογικη κ μετα βγαινει λαθος και η υλοποιηση... IF recource_size>l THEN το εκανα αυτο αλλα δεν δουλεψε παλι.. οσο για τα ονοματα ειναι ετσι δωσμενα..
Aztec Δημοσ. 27 Ιανουαρίου 2010 Δημοσ. 27 Ιανουαρίου 2010 Χωρίς να μπω στην λογική του τι θέλεις να κάνεις Το 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;
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.