Натолкнулся на символ "2" - PullRequest
0 голосов
/ 14 января 2020

В этой процедуре я хочу составить список всех процедур в моем коде, и пользователь выбирает номер для выполнения определенной процедуры или функции. Вот мой код

    CREATE OR REPLACE PROCEDURE calling
IS
    chosen VARCHAR2(1);
    V_count NUMBER;
BEGIN
    &chosen;
    IF    chosen='1' THEN
        V_count:=visited.count_nb_city_visited(&idclient); 
    ELSIF chosen='2' THEN
        V_count:=visited.max_vis;
        visited.extract_best(V_count);
    ELSIF chosen='3' THEN
        ORDER_ORIGIN_CITY.ORDER_CITY;
    ELSIF chosen='4' THEN
        ORDER_ORIGIN_CITY.ORDER_CLIENT;
    END IF;
END;

При запуске кода это предупреждение выскакивает «PLS-00103: Обнаружен символ« 2 »(если я выбираю число 2, и такая же ошибка отображается с любым выбранным номером)

1 Ответ

2 голосов
/ 14 января 2020

Вы не можете (не должны) использовать переменные подстановки в хранимой процедуре, поскольку она будет подставлять значения при компиляции (а не так, как вы, вероятно, ожидаете при выполнении).

Так что если вы подставите 2 для &chosen и 42 для &idclient, тогда ваш код будет скомпилирован как:

CREATE OR REPLACE PROCEDURE calling
IS
    chosen VARCHAR2(1);
    V_count NUMBER;
BEGIN
    2;
    IF    chosen='1' THEN
        V_count:=visited.count_nb_city_visited(42); 
    ELSIF chosen='2' THEN
        V_count:=visited.max_vis;
        visited.extract_best(V_count);
    ELSIF chosen='3' THEN
        ORDER_ORIGIN_CITY.ORDER_CITY;
    ELSIF chosen='4' THEN
        ORDER_ORIGIN_CITY.ORDER_CLIENT;
    END IF;
END;

и всегда будет выполняться с этими фиксированными значениями.

Вы получаете ошибка, потому что 2; не является допустимым оператором PL / SQL.

Вместо этого вы должны передать все переменные связывания в сигнатуре. Что-то вроде:

CREATE OR REPLACE PROCEDURE calling (
  chosen   IN NUMBER,
  idclient IN NUMBER
)
IS
  V_count NUMBER;
BEGIN
  IF    chosen = 1 THEN
    V_count:=visited.count_nb_city_visited(idclient); 
  ELSIF chosen = 2 THEN
    V_count:=visited.max_vis;
    visited.extract_best(V_count);
  ELSIF chosen = 3 THEN
    ORDER_ORIGIN_CITY.ORDER_CITY;
  ELSIF chosen = 4 THEN
    ORDER_ORIGIN_CITY.ORDER_CLIENT;
  END IF;
END;
/

Если вы хотите вызвать его из анонимного блока PL / SQL, то вы можете использовать переменные подстановки в этом блоке:

BEGIN
  calling(
    chosen   => &chosen,
    idclient => &idclient
  );
END;
/
...