Как написать хранимую процедуру в MariaDB? - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь написать хранимую процедуру / хранимую функцию в MariaDB (phpmyadmin / MySQL Workbench). Консоль выдает ошибку, которая говорит, что синтаксис неверен. Я надеюсь, что вы можете помочь мне.

Процедура:

CREATE PROCEDURE neuerKunde(
    IN Kunden_ID INT(11),
    IN Vorname VARCHAR(50),
    IN Nachname VARCHAR(50),
    IN Ort VARCHAR(100),
    IN PLZ VARCHAR(20),
    IN Straße VARCHAR(50),
    IN Telefon VARCHAR(50),
    IN EMail VARCHAR(100)
) AS 

DECLARE VARIABLE mid INTEGER; 
DECLARE VARIABLE pid INTEGER;

BEGIN
    SELECT
        MAX(kunde.Kunden_ID) + 1
    FROM
        kunde INTO :mid;

    INSERT INTO kunde(
        kunde.Kunden_ID,
        kunde.Vorname,
        kunde.Nachname,
        kunde.Ort,
        kunde.PLZ,
        kunde.Straße,
        kunde.Telefon,
        kunde.EMail
    )
VALUES(
    :mid,
    :Vorname,
    :Nachname,
    :Ort,
    :PLZ,
    :Straße,
    :Telefon,
    :EMail
);

EXECUTE
PROCEDURE neuerKunde(
    'Max',
    'Muster',
    'Berlin',
    '50667',
    'SuperStreet 12',
    '01726',
    'mail@mail.de'
);

Атрибуты таблицы на немецком языке, надеюсь, это вас не смущает. ; -)

1 Ответ

0 голосов
/ 08 января 2020

Попробуйте следующее.

Вещи, которые изменились:

  • Вам не нужно IN в параметрах, так как это тип параметра по умолчанию
  • Нет необходимости в Kunden_ID параметр, поскольку вы его не используете
  • Вы должны использовать префикс в параметрах, чтобы они не смешивались со столбцами
  • AS BEGIN используется только в SQL Server & Sybase. MySQL использует только BEGIN
  • Объявите переменные внутри процедуры и не используйте VARIABLE -string
  • Если вы не используете AUTO_INCREMENT, но используете max(), помните, что сначала таблица может быть пустой -> используйте ifnull()
  • Вместо :variable -синтаксиса используйте имя переменной
  • Сопоставьте BEGIN с END
  • Используйте DELIMITER при создании процедуры, так как по умолчанию (;) можно использовать в процедуре
  • Вы вызываете процедуру с помощью CALL procedure_name()

Процедура:

DELIMITER $$
CREATE PROCEDURE neuerKunde(
in_Vorname VARCHAR(50),
in_Nachname VARCHAR(50),
in_Ort VARCHAR(100),
in_PLZ VARCHAR(20),
in_Straße VARCHAR(50),
in_Telefon VARCHAR(50),
in_EMail VARCHAR(100)
)
BEGIN

DECLARE v_mid INTEGER; 
DECLARE v_pid INTEGER;

SELECT MAX(kunde.Kunden_ID) + 1 INTO v_mid;
FROM kunde;

INSERT INTO kunde( 
  Kunden_ID, 
  Vorname,   
  Nachname, 
  Ort, 
  PLZ, 
  Straße, 
  Telefon, 
  EMail 
)
VALUES( 
  ifnull(v_mid,1), 
  in_Vorname, 
  in_Nachname, 
  in_Ort, 
  in_PLZ, 
  in_Straße, 
  in_Telefon, 
  in_EMail 
);

end
$$

call neuerKunde(
    'Max',
    'Muster',
    'Berlin',
    '50667',
    'SuperStreet 12',
    '01726',
    'mail@mail.de'
)
$$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...