【问题标题】:Encountered the symbol "2"遇到符号“2”
【发布时间】:2020-01-14 10:34:32
【问题描述】:

在这个过程中,我想列出我的代码中的所有过程,并且用户选择一个数字来执行某个过程或函数。 这是我的代码

    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 并且我选择的任何数字都会显示相同的错误)

【问题讨论】:

    标签: oracle plsql procedure toad


    【解决方案1】:

    您不能(不应该)在存储过程中使用替换变量,因为它会替换编译时的值(而不是您可能期望的执行时的值)。

    因此,如果您将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;
    /
    

    【讨论】:

    • 在这种情况下,每次调用过程时都要输入idclient。我只在用户选择 1 时才需要它
    • @mariamjallouli 您不能这样做,因为替换变量都需要替换为要执行的代码。
    猜你喜欢
    • 2015-08-20
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2018-01-23
    • 2016-11-05
    • 1970-01-01
    相关资源
    最近更新 更多