2014-04-11 46 views
-1
DECLARE candidate CURSOR FOR 
      SELECT `ce_agr_perc`, `ce_year_of_passing`, `ql_id`,`ua_id`, 
        `sb_id`, `ps_id` ,`ce_id`, c_id 
      FROM `candidate_education` 
      WHERE c_id IN (SELECT c_id FROM `candidate`) 
      ORDER BY c_id; 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET d = 0; 

TRUNCATE TABLE `candidate_tag_string_copy`; 
OPEN candidate; 

read_loop: LOOP 
    FETCH candidate 
    INTO ceagrperc, ceyearofpassing, qlid, uaid, sbid, psid, ceid, cid; 

    IF d=1 THEN 
     LEAVE read_loop; 
    END IF; 
    IF NOT d=1 THEN 
     SELECT ql_short_code INTO qlcode FROM qualification_level 
     WHERE ql_id=qlid; 
     SELECT `us_short_code` INTO usshortcode FROM `university_affiliation` 
     WHERE ua_id=uaid; 
     SELECT `short_code` INTO shortcode FROM `school_boards` 
     WHERE sb_id=sbid; 
     SELECT `ds_id`,`dp_id` INTO dsid,dpid FROM `programe_specialization` 
     WHERE `ps_id`=psid; 
     SELECT `dp_short_code`, `dp_degree_edu_level` 
     INTO dpshortcode, dpdegreeedulevel 
     FROM `degree_programe` 
     WHERE `dp_id`=dpid; 
     SELECT `ds_short_code` INTO dsshortcode FROM `degree_specialization` 
     WHERE `ds_id`=dsid; 

     IF qlcode='UG' THEN 
      SELECT CONCAT('{', qlcode,';', dpshortcode, '-', 
           dsshortcode, ';', usshortcode, ';', 
           ceagrperc, ';', ceyearofpassing, '}') 
      INTO ctsstring ; 
      INSERT 
      INTO `candidate_tag_string_copy` 
         (`c_id`, `cts_tag_class`, `cts_fk_id`, `cts_string`) 
      VALUES(cid, 'edu', ceid, ctsstring); 
     END IF; 

     IF qlcode='PG' THEN 
      SELECT CONCAT('{', qlcode, '::', ';', dpshortcode, '-', 
           dsshortcode, ';', usshortcode, ';', 
           ceagrperc, ';', ceyearofpassing, '}') 
      INTO ctsstring ; 
      INSERT 
      INTO `candidate_tag_string_copy` 
         (`c_id`, `cts_tag_class`, `cts_fk_id`, `cts_string`) 
      VALUES(cid,'edu2',ceid,ctsstring); 
     END IF; 

     IF qlcode='XII' THEN 
      SELECT CONCAT('{', qlcode, ';', dpshortcode,'-', 
           dsshortcode, ';', usshortcode, ';', 
           ceagrperc, ';', ceyearofpassing, '}') 
      INTO ctsstring ; 
      INSERT 
      INTO `candidate_tag_string_copy` 
         (`c_id`, `cts_tag_class`, `cts_fk_id`, `cts_string`) 
      VALUES(cid, 'edu', ceid, ctsstring); 
     END IF; 

     IF qlcode='X' THEN 
      SELECT CONCAT('{', qlcode, ';', dpshortcode, '-', 
          dsshortcode, ';', usshortcode, ';', 
          ceagrperc, ';', ceyearofpassing, '}') 
      INTO ctsstring ; 
      INSERT 
      INTO `candidate_tag_string_copy` 
         (`c_id`, `cts_tag_class`, `cts_fk_id`, `cts_string`) 
      VALUES(cid, 'edu4', ceid, ctsstring); 
     END IF; 
    END IF; 
END LOOP; 

CLOSE candidate; 
+0

我在這樣的情況下做的第一件事,就是確保所有的代碼是否正確縮進。你可能有一個簡單的錯誤,但你的縮進很難確定。 –

+0

@ user2071660:變量'd'聲明的默認值是多少?那是'1'還是'0'? –

回答

0

按照文件上Fetch Statement

如果你獲取了過去在結果集中的最後一行,則目標字段或變量的值是不確定的,並且NOTFOUND屬性返回TRUE

注意:上面的語句是從Oracle光標文件,但適用於其他人。

我不知道你怎麼申報默認值變量dcursor handler使用。但是,我堅信這個問題是因爲沒有正確處理dnot found)值。

如果我是你,我早就編碼方式類似於以下內容:

declare not_found boolean default false; 
... 
declare continue handler for not found set not_found = true; 
... 
read_loop: LOOP 
    FETCH candidate 
    INTO ceagrperc, ceyearofpassing, qlid, uaid, sbid, psid, ceid, cid; 

    IF not_found THEN 
     LEAVE read_loop; 
    END IF; 

    ... 
    ... 
end loop; 
... 
相關問題