Ошибка переменной хранимой процедуры в PLSQL при объявлении переменных - PullRequest
2 голосов
/ 10 марта 2019

Использование 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

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Довольно много ошибок.

  • вам не нужно DECLARE в названной процедуре PL / SQL
  • имена параметров должны отличаться от имен столбцов, так что вы былучше использовать - например - p_area in nvarchar2, p_dateofvote in date
  • , если вы выберете 3 столбца, вы должны поместить их INTO 3 переменных - вы объявили только одну, поэтому либо объявите еще две, либо удалите AREAи DATEOFOTE из SELECT
  • для чего используются эти параметры?Обычно, как часть предложения 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>

[EDIT]

После прочтения комментария, возможно, вы предпочтете использовать функцию.

Некоторыевыборочные значения:

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>
1 голос
/ 10 марта 2019

DECLARE не допускается в теле процедуры PL / SQL. IS или AS служит для определения границ, где начинается раздел объявления переменных, поэтому ваша процедура должна быть

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, который я удалил.

Удачи.

...