Невозможно создать новую процедуру в SQL Manager Lite - PullRequest
0 голосов
/ 13 января 2019

Я работаю с SQL Manager Lite для приложения Interbase / Firebird. Я скачал базу данных firebird, успешно подключился к этой базе данных и ее хосту, но теперь я хочу создать процедуру.

Я не мог сделать это с помощью учебников, поэтому я решил просто нажать New-> Процедура и сделать это автоматически. Но при этом у меня все еще есть ошибки.

Мой код, который я пробовал, не нажимая New-> Процедура:

CREATE PROCEDURE MyProc
AS
  SELECT M_DOKUMENTY.NDZIEN FROM M_DOKUMENTY WHERE M_DOKUMENTY.SRODZAJ = '1234'
GO;

Код, сгенерированный с помощью мастера New-> Процедура:

CREATE PROCEDURE SHOW_ALL
AS
BEGIN
  /* Procedure body */
  SELECT 
    M_DOKUMENTY.NDZIEN,
    M_DOKUMENTY.CKIERUNEK,
    M_DOKUMENTY.CMEDIUM FROM M_DOKUMENTY WHERE M_DOKUMENTY.SRODZAJ = '1234'
  SUSPEND;
END;

Но когда я нажимаю на значок молнии (скомпилировать), он жалуется на ошибку:

Ошибка динамического SQL.

Код ошибки SQL = -104.

Токен неизвестен - строка 9, столбец 3.

ПРИОСТАНОВИТЬ.

Как это исправить?

Снимок экрана ошибки в SQL Manager lite

1 Ответ

0 голосов
/ 13 января 2019

Проблема в том, что ваш синтаксис неправильный. Вам необходимо определить выходные параметры и использовать либо select ... into <list of variables>, чтобы выбрать одну строку, либо for select ... into <list of variables> do, чтобы зациклить несколько строк.

Ваша хранимая процедура должна выглядеть примерно так:

CREATE PROCEDURE SHOW_ALL
  RETURNS (NDZIEN varchar(50), CKIERUNEK varchar(50), CMEDIUM varchar(50))
AS
BEGIN
  /* Procedure body */
  for SELECT 
        M_DOKUMENTY.NDZIEN,
        M_DOKUMENTY.CKIERUNEK,
        M_DOKUMENTY.CMEDIUM 
      FROM M_DOKUMENTY 
      WHERE M_DOKUMENTY.SRODZAJ = '1234'
      into :NDZIEN, :CKIERUNEK, :CMEDIUM 
  do
    SUSPEND;
END

Если ваш выбор производит только одну строку, то вы также можете рассмотреть возможность использования

CREATE PROCEDURE SHOW_ALL
  RETURNS (NDZIEN varchar(50), CKIERUNEK varchar(50), CMEDIUM varchar(50))
AS
BEGIN
  /* Procedure body */
  SELECT 
      M_DOKUMENTY.NDZIEN,
      M_DOKUMENTY.CKIERUNEK,
      M_DOKUMENTY.CMEDIUM 
    FROM M_DOKUMENTY 
    WHERE M_DOKUMENTY.SRODZAJ = '1234'
    into :NDZIEN, :CKIERUNEK, :CMEDIUM;
  SUSPEND;
END

Обратите внимание на ; после предложения into. В этом случае вы также можете пропустить SUSPEND;. Это сделает хранимую процедуру исполняемой, а не выбираемой. В зависимости от того, как вы хотите его использовать, это может быть лучшим выбором.

См. Документацию Firebird по созданным хранимым процедурам и его процедурному языку SQL для получения дополнительной информации.

...