Βοήθεια σε αρχάριο σχετικά με SQL Procedures.

Γενικές συζητήσεις για SQL και SQL Servers (RDBMS)

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
jane20
Δημοσιεύσεις: 9
Εγγραφή: 01 Ιουν 2008 17:17

Βοήθεια σε αρχάριο σχετικά με SQL Procedures.

Δημοσίευση από jane20 » 01 Φεβ 2010 16:52

Γεια σας! Θα ήθελα τη βοήθειά σας σχετικά με τις create procedure δηλώσεις που προσπαθώ να υλοποιήσω. Παρακάτω παραθέτω τον κώδικα για τις create εντολές της βάσης δεδομένων στην οποία εργάζομαι για τις συγκεκριμένες SQL Procedures:

CREATE DATABASE dblab_games DEFAULT CHARSET=greek;
USE dblab_games;

CREATE TABLE category(
cat_id int not null auto_increment,
cat_name varchar(20) not null,
cat_descr text,
cat_parent int,
PRIMARY KEY (cat_id),
FOREIGN KEY (cat_parent) REFERENCES category(cat_id)
ON DELETE SET NULL ON UPDATE CASCADE
)ENGINE=InnoDB COLLATE=greek_general_ci;

CREATE TABLE game(
gam_id int not null auto_increment,
gam_title varchar(50) not null,
gam_descr text,
gam_details text,
gam_pubdate datetime not null,
gam_cat_id int,
PRIMARY KEY (gam_id),
FOREIGN KEY (gam_cat_id) REFERENCES category(cat_id)
ON DELETE SET NULL ON UPDATE CASCADE
)ENGINE=InnoDB COLLATE=greek_general_ci;

CREATE TABLE platform(
plt_name ENUM('PC','XBOX','PS3','PS2','PSP','WII') not null,
plt_gam_id int not null,
PRIMARY KEY (plt_name,plt_gam_id),
FOREIGN KEY (plt_gam_id) REFERENCES game(gam_id)
ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB COLLATE=greek_general_ci;

CREATE TABLE patch(
pch_gam_id int not null,
pch_version float(3,1) not null,
pch_fixed text,
pch_instr text,
pch_url varchar(255) not null,
PRIMARY KEY (pch_gam_id, pch_version),
FOREIGN KEY (pch_gam_id) REFERENCES game(gam_id)
ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB COLLATE=greek_general_ci;

CREATE TABLE system_user(
usr_username varchar(20) not null,
usr_password varchar(10) not null,
usr_email varchar(255) not null,
PRIMARY KEY (usr_username)
)ENGINE=InnoDB COLLATE=greek_general_ci;

CREATE TABLE reviewer(
rvr_username varchar(20) not null,
rvr_name varchar(20) not null,
rvr_lastname varchar(20) not null,
rvr_cv text,
PRIMARY KEY (rvr_username),
FOREIGN KEY (rvr_username) REFERENCES system_user(usr_username)
ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB COLLATE=greek_general_ci;

CREATE TABLE evaluation(
evl_usr_username varchar(20) not null,
evl_gam_id int not null,
evl_grade int not null,
PRIMARY KEY (evl_usr_username, evl_gam_id),
FOREIGN KEY (evl_usr_username) REFERENCES system_user(usr_username)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (evl_gam_id) REFERENCES game(gam_id)
ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB COLLATE=greek_general_ci;

CREATE TABLE review(
rev_rvr_username varchar(20) not null,
rev_gam_id int not null,
rev_text text,
rev_date datetime not null,
PRIMARY KEY (rev_rvr_username, rev_gam_id),
FOREIGN KEY (rev_rvr_username) REFERENCES reviewer(rvr_username)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (rev_gam_id) REFERENCES game(gam_id)
ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB COLLATE=greek_general_ci;

CREATE TABLE resource(
res_path varchar(255) not null,
res_size int not null,
res_title varchar(50) not null,
res_gam_id int not null,
PRIMARY KEY (res_path),
FOREIGN KEY (res_gam_id) REFERENCES game(gam_id)
ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB COLLATE=greek_general_ci;

CREATE TABLE walkthrough(
wlk_path varchar(255) not null,
wlk_lang varchar(10) not null,
wlk_type ENUM('pdf','txt','doc','docx','ps') not null,
PRIMARY KEY (wlk_path),
FOREIGN KEY (wlk_path) REFERENCES resource(res_path)
ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB COLLATE=greek_general_ci;

CREATE TABLE video(
vid_path varchar(255) not null,
vid_quality ENUM('High','Medium','Low') not null,
vid_type ENUM('In-game','Trailer') not null,
PRIMARY KEY (vid_path),
FOREIGN KEY (vid_path) REFERENCES resource(res_path)
ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=InnoDB COLLATE=greek_general_ci;




Λοιπόν πάνω στη συγκεκριμένη βάση έχω τις εξής διαδικασίες προς υλοποίηση:

1. GAME_QUOTA: Stored procedure η οποία δέχεται ως είσοδο τον κωδικό ενός παιχνιδιού και έναν αριθμό (όριο μεγέθους) και αν το συνολικό μέγεθος των resources του παιχνιδιού ξεπερνά το όριο που δίνεται, ξεκινά να διαγράφει από τα resources με το μεγαλύτερο μέγεθος μέχρι το συνολικό μέγεθος να φτάσει κάτω από το όριο.
2. GET_CATPATH: Stored procedure η οποία δέχεται ως είσοδο τον κωδικό μιας κατηγορίας και εκτυπώνει το μονοπάτι μέχρι την κορυφή του δέντρου κατηγοριών. Συγκεκριμένα εκτυπώνει την γονική της, μετά την γονική της γονικής κοκ μέχρι να βρεθεί κατηγορία που δεν έχει πατέρα.
3. DEL_CAT: Stored procedure η δέχεται ως είσοδο ένα id μιας κατηγορίας που θέλουμε να διαγραφεί και ελέγχει αν έχει παιδιά. Αν ναι, τα αναθέτει στη γονική της. (πχ αν η κατηγορία sports έχει γονέα την κατηγορία entertainment και παιδί
την football και διαγραφεί η sports, τότε θα ανατίθεται πριν τη διαγραφή η football στην entertainment) και ακολούθως διαγράφει την κατηγορία.

ΠΑΡΑΚΑΛΩ ΟΠΟΙΟΝ ΜΠΟΡΕΙ ΝΑ ΜΕ ΒΟΗΘΗΣΕΙ ΤΟΥΛΑΧΙΣΤΟΝ ΣΕ ΚΑΠΟΙΑ ΑΠΟ ΤΙΣ ΤΡΕΙΣ ΑΥΤΕΣ ΥΛΟΠΟΙΗΣΕΙΣ-----ΕΠΕΙΓΕΙ------

ΕΥΧΑΡΙΣΤΩ ΕΚ ΤΩΝ ΠΡΟΤΕΡΩΝ

jane20
Δημοσιεύσεις: 9
Εγγραφή: 01 Ιουν 2008 17:17

Βοήθεια σε αρχάριο σχετικά με SQL Procedures.

Δημοσίευση από jane20 » 01 Φεβ 2010 19:09

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

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27626
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Βοήθεια σε αρχάριο σχετικά με SQL Procedures.

Δημοσίευση από cordis » 01 Φεβ 2010 19:50

δείξε μας που έχεις φτάσει τον κώδικα να σε βοηθήσουμε.
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

jane20
Δημοσιεύσεις: 9
Εγγραφή: 01 Ιουν 2008 17:17

Βοήθεια σε αρχάριο σχετικά με SQL Procedures.

Δημοσίευση από jane20 » 01 Φεβ 2010 20:10

H απάντησή μου για το ερώτημα 1 είναι η ακόλουθη:

delimiter $
create procedure GAME_QUOTA(IN id INT,IN l INT)
begin
set @l=7;
if (res_size > l)
then SET DELETE FROM resource WHERE res_size > l;
end if;
end
$;


η οποία βγάζει σφάλμα.

Η απάντηση μου γι ατο ερώτημα 2 για το οποίο θα ήθελα την άποψή σας, είναι η εξής:

delimiter #

create procedure GET_CATPATH (IN catcode int)
BEGIN

declare p_code int;
declare cat varchar(30);
declare parent varchar(30);
REPEAT
select cat_name into cat
from category
where (cat_id=catcode);
select cat_parent into p_code
from category
where (cat_id=catcode);
select b.cat_name into parent
from category as a, category as b
where (a.cat_id=catcode) and (a.cat_parent=b.cat_id);

if (p_code is not NULL)
then
select cat,parent;
set catcode=p_code;
end if;

until (p_code is NULL)
end repeat;
end#



Και τέλος, για το ερώτημα 3 έδωσα αυτήν την λύση μέχρι στιγμής και περιμένω παρατηρήσεις:

DELIMETER #

CREATE PROCEDURE DEL_CAT (IN categor_id INT)
BEGIN
DECLARE categor_child INT;
DECLARE new_parent INT;
DECLARE not_found_message INT;

SELECT cat_name, cat_parent FROM category WHERE cat_id = categor_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found_message=1;
OPEN categor_cursor;
SET not_found_message=0;

REPEAT
FETCH categor_cursor INTO categor_child;
IF (not_found_message=0)
THEN update category SET cat_parent=new_parent WHERE cat_id=categor_child;
END IF;
UNTIL (not_found_message=1) END REPEAT;

CLOSE categor_cursor;
DELETE FROM category WHERE cat_id = categor_id;

END #

jane20
Δημοσιεύσεις: 9
Εγγραφή: 01 Ιουν 2008 17:17

Βοήθεια σε αρχάριο σχετικά με SQL Procedures.

Δημοσίευση από jane20 » 01 Φεβ 2010 21:26

κάποιος??????????????

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27626
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Βοήθεια σε αρχάριο σχετικά με SQL Procedures.

Δημοσίευση από cordis » 01 Φεβ 2010 21:53

για το 1ο που πρόλαβα να κοιτάξω

1ον. πρέπει να γίνει με while
2ον. εντολή SET DELETE δεν υπάρχει μόνο σκέτο DELETE
3ον. το set @l=7; δεν υπάρχει κάπου στην εκφώνηση, θα πρέπει να το παίρνεις με select @l=sum(res_size) from resource where res_gam_id = @id;
4ον. το Delete που έχεις βάλει θα σβήσει όλα τα παιχνίδια από την στιγμή που δεν έχεις βάλει στους όρους και το res_gam_id = @id.
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

jane20
Δημοσιεύσεις: 9
Εγγραφή: 01 Ιουν 2008 17:17

Βοήθεια σε αρχάριο σχετικά με SQL Procedures.

Δημοσίευση από jane20 » 01 Φεβ 2010 22:00

ευχαριστώ πολύ για τη βοήθεια

Απάντηση

Επιστροφή στο “Βάσεις Δεδομένων και SQL - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης