2014-12-01 2 views
1

Я пытался использовать IF ELSE в моем назначении PLSQLLoop и IF заявление в PLSQL

Вот часть моего текущего кода

FETCH c2 into Mark, credit_hour; 
    IF Mark = 'A+' THEN 
     Points := Points + (4.0 * credit_hour); 
    ELSIF Mark = 'A ' THEN 
     Points := Points + (4.0 * credit_hour); 
    ELSIF Mark = 'A-' THEN 
     Points := Points + (3.7 * credit_hour); 
    ELSIF Mark = 'B+' THEN 
     Points := Points + (3.3 * credit_hour); 
    ELSIF Mark = 'B ' THEN 
     Points := Points + (3.0 * credit_hour); 
    ELSIF Mark = 'B-' THEN 
     Points := Points + (2.7 * credit_hour); 
    ELSIF Mark = 'C+' THEN 
     Points := Points + (2.3 * credit_hour); 
    ELSIF Mark = 'C ' THEN 
     Points := Points + (2.0 * credit_hour); 
    ELSIF Mark = 'C-' THEN 
     Points := Points + (1.7 * credit_hour); 
    ELSIF Mark = 'D+' THEN 
     Points := Points + (1.3 * credit_hour); 
    ELSIF Mark = 'D ' THEN 
     Points := Points + (1.0 * credit_hour); 
    ELSEIF Mark = 'D-' THEN 
     Points := Points + (0.7 * credit_hour); 
    ELSE Mark = 'F' THEN 
     Points := Points + (0.0 * credit_hour); 
    END IF; 

, но потом я подумал, что может сократить процесс используя двойную петлю параметров, как

FETCH c2 into Mark, credit_hour; 
for (i,k) in (A+,A,A-,B+,B,B-,C+,C,C-,D+,D,D-,F)  (4.0,4.0,3.7,3.3,3.0,2.7,2.3,2.0,1.7,1.3,1.0,0.7,0.0) 

IF Mark = i THEN 
Points := Points + (k * credit_hour); 

, но я не знаю, как я могу это сделать в PLSQL

ответ

1

Для вашего текущего кода, я бы рекомендовал использовать case when, так как это намного легче читать:

Points := Points 
      + case Mark 
      when 'A+' then 4.0 
      when 'A ' then 4.0 
      ... 
      end 
      * credit_hour; 

Или, еще лучше, создать (временную) таблицу для хранения значений в и создать select , необязательно с соединением с исходной таблицей, тогда вам вообще не нужен PL/SQL.

+1

Я бы также предложил использовать таблицу, похоже, лучший подход к этой проблеме. –

Смежные вопросы