Вы не можете (не должны) использовать переменные подстановки в хранимой процедуре, поскольку она будет подставлять значения при компиляции (а не так, как вы, вероятно, ожидаете при выполнении).
Так что если вы подставите 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;
/