Luk*_*ood 4 sql oracle plsql stored-procedures oracle11g
创建以下存储过程时使用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 的 equalvotes 标记列
错误还蛮多的。
DECLARE在指定的 PL/SQL 过程中p_area in nvarchar2, p_dateofvote in dateINTO3 个变量 - 您只声明了一个,因此要么声明另外两个,要么AREA从DATEOFOTESELECTWHERE- 在您的代码中并非如此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>
| 归档时间: | 
 | 
| 查看次数: | 4720 次 | 
| 最近记录: |