【问题标题】:Stored procedure variable error in PLSQL when declaring variables声明变量时PLSQL中的存储过程变量错误
【发布时间】:2019-08-01 04:30:37
【问题描述】:

在创建以下存储过程时使用 Oracle 11g

    create or replace PROCEDURE sp_EqualVote(AREA IN NVARCHAR2, DATEOFVOTE IN DATE)
IS
  DECLARE test nvarchar(255);
  BEGIN
    SELECT
      AREA,
      DATEOFVOTE,
    CASE
      WHEN (REMAINVOTES = LEAVEVOTES) THEN REMAINVOTES
    END AS EqualVote
    INTO test
    FROM VOTING
    WHERE REMAINVOTES = LEAVEVOTES;
    END;
  END;

我遇到以下错误,我不太清楚该去哪里

PLS-00103: Encountered the symbol "DECLARE" when expecting one of the following: begin function pragma procedure subtype type <an identifier> <a double-quoted delimited-identifier> current cursor delete exists prior external language The symbol "begin" was substituted for "DECLARE" to continue.

我是一名大学生,对 PLSQL 不是很熟悉。这个想法是存储过程应该显示一个区域是否具有相同的票数,给定过程中的区域和日期,然后显示一个值为 50 的等票标记列

【问题讨论】:

    标签: sql oracle stored-procedures plsql oracle11g


    【解决方案1】:

    DECLARE 不允许在 PL/SQL 过程的主体中。 ISAS 用于分隔变量声明部分的开始位置 - 所以你的过程应该是

    create or replace PROCEDURE sp_EqualVote(AREA IN NVARCHAR2, DATEOFVOTE IN DATE)
    IS
      test nvarchar(255);
    BEGIN
      SELECT
        AREA,
        DATEOFVOTE,
        CASE
          WHEN (REMAINVOTES = LEAVEVOTES) THEN REMAINVOTES
        END AS EqualVote
      INTO test
      FROM VOTING
      WHERE REMAINVOTES = LEAVEVOTES;
    END;
    

    你还有一个额外的END,我删除了。

    祝你好运。

    【讨论】:

      【解决方案2】:

      不少错误。

      • 在命名的 PL/SQL 过程中不需要DECLARE
      • 参数名称应该与列名称不同,因此您宁愿使用 - 例如 - p_area in nvarchar2, p_dateofvote in date
      • 如果选择 3 列,则必须将它们放入 INTO 3 个变量 - 您只声明了一个,所以要么再声明两个,要么从 SELECT 中删除 AREADATEOFOTE
      • 这些参数是做什么用的?通常,作为WHERE 子句的一部分 - 您的代码中并非如此
      • 注意SELECT 语句返回的行数。如果您选择标量变量,请确保它只返回一行
      • 一旦你获得了TEST 变量的值,你将如何处理它?目前,什么都没有
      • 你有一个END,这是一个盈余。

      因此,考虑这样的事情应该至少编译(取决于表描述):

      SQL> create table voting (area nvarchar2(10),
        2                       dateofvote date,
        3                       remainvotes nvarchar2(10),
        4                       leavevotes nvarchar2(10));
      
      Table created.
      
      SQL> create or replace procedure
        2    sp_equalvote(p_area in nvarchar2, p_dateofvote in date)
        3  is
        4    test nvarchar2(255);
        5  begin
        6    select
        7      case when remainvotes = leavevotes then remainvotes end
        8      into test
        9      from voting
       10      where remainvotes = leavevotes
       11        and area = p_area
       12        and dateofvote = p_dateofvote;
       13  end;
       14  /
      
      Procedure created.
      
      SQL>
      

      [编辑]

      看完评论,也许你更愿意用一个函数。

      一些样本值:

      SQL> insert into voting values (1, date '2019-02-20', 100, 15);
      
      1 row created.
      
      SQL> insert into voting values (1, date '2019-03-10', 300, 300);
      
      1 row created.
      

      功能:

      SQL> create or replace function
        2    sp_equalvote(p_area in nvarchar2, p_dateofvote in date)
        3  return nvarchar2
        4  is
        5    test nvarchar2(255);
        6  begin
        7    select
        8      case when remainvotes = leavevotes then 'draw'
        9           else 'not equal'
       10      end
       11    into test
       12    from voting
       13    where area = p_area
       14      and dateofvote = p_dateofvote;
       15
       16    return test;
       17  end;
       18  /
      
      Function created.
      
      SQL>
      

      测试:

      SQL> select * From voting;
      
      AREA       DATEOFVOTE REMAINVOTE LEAVEVOTES
      ---------- ---------- ---------- ----------
      1          20.02.2019 100        15
      1          10.03.2019 300        300
      
      SQL> select sp_equalvote(1, date '2019-02-20') res from dual;
      
      RES
      --------------------
      not equal
      
      SQL> select sp_equalvote(1, date '2019-03-10') res from dual;
      
      RES
      --------------------
      draw
      
      SQL>
      

      【讨论】:

      • 感谢您的回复 littlefoot,我为自己的愚蠢道歉,但我不太确定 1. 然后如何调用此过程(顺便说一句,它可以工作,并且您的表格描述是正确的) 2. 想法是它将显示查询的结果以显示列或更有用的单列表示绘制,因为这两个值是相同的。再次感谢您的帮助
      • 不客气,而且 - 不,你并不愚蠢。我编辑了我的信息并添加了一个示例;请看一下。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 2019-07-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多