2016-05-26 22 views
0

私のデータベースのstudentテーブルに2つの列を作成しました。今私は学生テーブルのカーソルを作成する必要があります。私は、カーソルクエリの結果をフィルタリングするために、生徒IDと生徒IDの入力パラメータを使用する必要があります。 作成したカーソルを開いて、生徒に電子メールが割り当てられているかどうかを確認する必要もあります。電子メールが割り当てられていない場合は、電子メール列を更新して、電子メールを学生に割り当てる必要があります。ケースの文を書く手助けが必要です - MySQLカーソル

最後に私は助けが必要な理由: 私はこのカーソルのcase文をどのように書くのか分かりません。私はこれを行う良い方法を考えようとしましたが、成功しませんでした。助けてください!!

DELIMITER $ 

DROP PROCEDURE IF EXISTS CURSOR_DEMO$ 

CREATE PROCEDURE CURSOR_DEMO(start_student_id INT 
          ,end_student_id  INT 
          ) 
BEGIN 

DECLARE l_table_name VARCHAR(50); 
DECLARE iam_done INT DEFAULT 0; 
DECLARE l_sql_stmt VARCHAR(5000); 


SET @l_sql_stmt='ALTER TABLE STUDENT ADD EMAIL VARCHAR'; 
    SELECT @l_sql_stmt; 
    prepare stmt from @l_sql_stmt; 
    execute stmt; 


SET @l_sql_stmt='ALTER TABLE STUDENT ADD PHONE int(10)'; 
    SELECT @l_sql_stmt; 
    prepare stmt from @l_sql_stmt; 
    execute stmt; 

DECLARE TBL_CUR CURSOR FOR 
    SELECT EMAIL FROM STUDENT.TABLES WHERE TABLE_SCHEMA='MYSQLDB'; 



BEGIN 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET IAM_DONE=1; 



    OPEN TBL_CUR; 



     tbl_loop:LOOP 
      FETCH tbl_cur INTO l_table_name;   

       IF IAM_DONE = 1 THEN 

        LEAVE tbl_loop; 

       END IF; 


       CASE WHEN l_table_name = 'STUDENT' THEN 



       ELSE BEGIN END;      


       END CASE;      



     END LOOP tbl_loop; 

    CLOSE TBL_CUR; 

END; 

END$ 

DELIMITER ; 

答えて

0

これは必要なものですか?

/* 
drop table student; 
delimiter $$ 
CREATE TABLE `student` (
    `id` int(11) NOT NULL , 
    `name` char(1) NOT NULL, 
    `email` varchar(1), 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8$$ 

drop table email; 
delimiter $$ 

CREATE TABLE `email` (
    `id` int(11) NOT NULL , 
    `type` varchar(8) NOT NULL, 
    `person_id` int, 
    `email` varchar(1), 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8$$ 
; 
*/ 
DELIMITER $ 
DROP PROCEDURE IF EXISTS CURSOR_DEMO$ 
CREATE PROCEDURE CURSOR_DEMO(start_student_id INT 
          ,end_student_id  INT) 
BEGIN 

declare email_person_id int; 
declare email_address varchar(50); 
DECLARE done INT DEFAULT 0; 
DECLARE CUR CURSOR FOR 
    SELECT person_id,email FROM sandbox.email where type = 'student'; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 

    OPEN CUR; 
     cur_loop:LOOP 
       IF done = 1 THEN 
        LEAVE cur_loop; 
       END IF; 
       FETCH CUR INTO email_person_id,email_address; 
       update student 
       set  email = email_address 
       where id = email_person_id 
        and email is null 
       ; 
     END LOOP cur_loop; 
    CLOSE CUR; 
    commit; 
END$ 
DELIMITER ; 
truncate table student; 
insert into student 
values 
(1,'A','1'), 
(2,'B','1'), 
(3,'C',null), 
(4,'D',null), 
(5,'E',null), 
(6,'G',null), 
(7,'F',null) 
; 
truncate table email; 
insert into email 
values 
(1,'student',1,'a'), 
(2,'student',2,'b'), 
(3,'faculty',7,'z'), 
(4,'student',3,'c') 
; 

select * from student; 

call cursor_demo(1,10); 

select * from student; 
+0

カーソルは最後の手段です。可能であれば、カーソルではなく更新ステートメントを使用する必要があります。 –

+0

こんにちは、返信いただきありがとうございます。電子メールは列であり、表ではありません。そして私は電子メールと電話のための列を作成するためにalterを使いました。 –

+0

正直言って、以下の理由から、この手順で達成しようとしていることを理解できませんでした: - 変更ステートメントを含めるということは、この手順を再利用できないことを意味します。プロシージャは構文ではありません(すべての宣言はbeginブロックの先頭になければならず、tbl_cursor宣言はありません)。カーソルへの選択は意味をなさないものです。私はまた、あなたが生徒の記録を更新するためにメールアドレスを取得していた場所を見ることができませんでした。あなたが持っているテーブルとあなたが望む出力を公開しておけば助けになるかもしれません。 –

関連する問題