продолжая петли вещь в оракуле - PullRequest
0 голосов
/ 22 октября 2018

Я выполняю еще одно упражнение, чтобы узнать разные вещи о синтаксисе Oracle SQL. Сегодняшний урок, который я выбрал - это циклы.Ниже приведен код, где я пытаюсь, чтобы два поля (временные переменные) имели значения, уменьшающиеся до тех пор, пока оно не станет меньше нуля, в зависимости от того, какая из переменных попадет в ноль, зависит от того, какой текст я хотел бы вывести в вывод скрипта.Надеюсь, это имеет смысл.Если я сделал какие-то фальшивки, пожалуйста, кричите на меня.

DECLARE
        "Character"         VARCHAR2(255);
        "Enemy"             VARCHAR2(255);
        "Character_Health"  NUMBER;
        "Enemy_Health"      NUMBER;
        "Character_Attack"  NUMBER;
        "Enemy_Attack"      NUMBER;


BEGIN -- Generates Base Stats


        SELECT 'Hero'       INTO "Character"        FROM dual;
        SELECT 'Villain'    INTO "Enemy"            FROM dual;
        SELECT 100          INTO "Character_Health" FROM dual;
        SELECT 25           INTO "Enemy_Health"     FROM dual;
        SELECT 10           INTO "Character_Attack" FROM dual;
        SELECT 5            INTO "Enemy_Attack"     FROM dual;

        dbms_output.put_line    ("Character" || ' (' || "Character_Health" || ') VS ' ||' '|| "Enemy" || ' (' || "Enemy_Health" || ')') ;
        dbms_output.put_line    ('');
        dbms_output.put_line    ('FIGHT!');

    BEGIN -- Round 1

            LOOP
            dbms_output.put_line    ('');

            SELECT "Enemy_Health" - "Character_Attack" INTO "Enemy_Health" FROM dual; -- Hero hits Villain
            dbms_output.put_line    ("Character" || ' Hits ' || "Enemy" || ' for ' || "Character_Attack" ||' Damage' ); 
            dbms_output.put_line    ("Enemy" || ' Has ' || "Enemy_Health" || ' Health Remaining ');

            CASE WHEN "Enemy_Health" < 0 THEN dbms_output.put_line ("Enemy" || 'Has Fainted' || "Character" || 'Wins!'); 
            ELSE CONTINUE;
            EXIT WHEN "Enemy_Health" < 0;

            SELECT "Character_Health" - "Enemy_Attack" INTO "Character_Health" FROM dual; -- Villain hits Hero
            dbms_output.put_line    ('');
            dbms_output.put_line    ("Enemy" || ' Hits ' || "Character" || ' for ' || "Enemy_Attack" ||' Damage' );
            dbms_output.put_line    ("Character" || ' Has ' || "Character_Health" || ' Health Remaining ');

            CASE WHEN "Character_Health" < 0 THEN dbms_output.put_line ("Character" || 'Has Fainted' || "Enemy" || 'Wins!'); 
            ELSE CONTINUE;
            EXIT WHEN "Character_Health" < 0;

            END LOOP;
    END;            
END;

1 Ответ

0 голосов
/ 22 октября 2018

Я нашел несколько ошибок1. Синтаксис для случая:

CASE [ expression ]

   WHEN condition_1 THEN result_1
   WHEN condition_2 THEN result_2
   ...
   WHEN condition_n THEN result_n

   [ELSE result]

END CASE

Узнать больше:- простое утверждение дела - поиск выписки по делу

CONTINUE останавливает цикл обработки и запускает его с самого начала, поэтому ваша логика повреждена - атакует только Герой.

Вам нужно место после "обморока"

В этом случае лучше использовать IF:

IF "Character_Health" < 0
THEN
  dbms_output.put_line ("Character" || 'Has Fainted. ' || "Enemy" || 'Wins!');
  EXIT; 
END IF;

Это не ошибка, но вам не нужно select into from dual, если выхочу изменить значение переменной.

Последнее, но не менее важное - мне не нравится, как вы используете переменные.«Character_Health» похож на «Character_Health» или «Character_Health».Лучше использовать имена, такие как CharacterHealth или Character_health.

Моя версия будет выглядеть примерно так:

    DECLARE
        v_Character         VARCHAR2(255) := 'Hero' ;
        v_Enemy             VARCHAR2(255) := 'Villain';
        v_Character_Health  NUMBER := 100;
        v_Enemy_Health      NUMBER := 25;
        v_Character_Attack  NUMBER := 10;
        v_Enemy_Attack      NUMBER := 5;
        v_nl                VARCHAR2(1) := chr(10);
    BEGIN
        dbms_output.put_line    (v_Character || ' (' || v_Character_Health || ') VS ' ||' '|| v_Enemy || ' (' || v_Enemy_Health || ')' || v_nl) ;
        dbms_output.put_line    ('FIGHT!' || v_nl);

        LOOP
        v_Enemy_Health := v_Enemy_Health - v_Character_Attack;
        dbms_output.put_line    (v_Character || ' Hits ' || v_Enemy || ' for ' || v_Character_Attack ||' Damage' ); 
        dbms_output.put_line    (v_Enemy || ' Has ' || v_Enemy_Health || ' Health Remaining' || v_nl);
        IF v_Enemy_Health < 0 THEN dbms_output.put_line (v_Enemy || 'Has Fainted. ' || v_Character || 'Wins!'); EXIT;
        END IF;

        v_Character_Health := v_Character_Health - v_Enemy_Attack;
        dbms_output.put_line    (v_Enemy || ' Hits ' || v_Character || ' for ' || v_Enemy_Attack || ' Damage' );
        dbms_output.put_line    (v_Character || ' Has ' || v_Character_Health || ' Health Remaining' || v_nl);

        IF v_Character_Health < 0 THEN dbms_output.put_line (v_Character || 'Has Fainted. ' || v_Enemy || 'Wins!'); EXIT; 
        END IF;

        END LOOP;           
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...