2014-12-23 5 views
1

Я новичок в хранимых процедурах в MySQL. Почему это начало моей хранимой процедуры ...MySQL: Неизвестный столбец в 'списке полей'

DROP PROCEDURE IF EXISTS videodb.addVideo; 
CREATE PROCEDURE videodb.addVideo(vidTitle VARCHAR(255), vidDescription VARCHAR(500), producerArray VARCHAR(500), actorArray VARCHAR(500), OUT vidSuccess BOOL) 
    START TRANSACTION; 
      SET @videoInsertVar = 'INSERT INTO videodb.videos (id, title, description) VALUES(?, ?, ?)'; 
      SET @videoId = NULL; 
      SET @videoTitle = vidTitle; -- this is line 69 

... производит эту странную ошибку ...

ERROR 1054 (42S22) at line 69: Unknown column 'vidTitle' in 'field list' 
+1

Оберните в 'BEGIN'-'END', что сделает * body * одним утверждением. См. Http://dev.mysql.com/doc/refman/5.7/en/create-procedure.html –

+0

Вы правы. Первоначально у меня был «BEGIN ... END», но я неправильно истолковал документацию. Я подумал, что это означает, что вместо «BEGIN ... END» вместо «BEGIN ... END» следует использовать «START TRANSACTION», но теперь я понимаю: «Во всех хранимых программах (хранимых процедурах и функциях, триггерах и событиях) парсер рассматривает BEGIN [WORK ] как начало блока BEGIN ... END. Чтобы начать транзакцию в этом контексте, вместо этого используйте START TRANSACTION. " –

+0

@ PM77-1 Если вы включите свой комментарий в ответ, я приму его. И спасибо за вашу помощь! –

ответ

2

Ваша проблема заключается в том, что инструкция, которая вызывает ошибку, на самом деле равна за пределами вашей процедуры и, следовательно, вне ее области параметров. Решение состоит в том, чтобы обернуть весь regular_body процедуры в структуру BEGIN ... END для создания Compound Statement.

CREATE PROCEDURE ожидает «Действительный оператор SQL-инструкции» в его теле. Использование синтаксиса Compound-Statement позволяет группировать несколько операторов в один блок кода и соответствовать этому требованию.

0

Вы пропускаете IN -denoting, что входной параметр, и я надеюсь, у вас есть END - последняя строка.

Попробуйте некоторые изменения, как это:

CREATE PROCEDURE videodb.addVideo(IN vidTitle VARCHAR(255), IN vidDescription VARCHAR(500), IN producerArray VARCHAR(500), IN actorArray VARCHAR(500), OUT vidSuccess BOOL) 
BEGIN 
    START TRANSACTION; 
      SET @videoInsertVar = 'INSERT INTO videodb.videos (id, title, description) VALUES(?, ?, ?)'; 
      SET @videoId = NULL; 
      SET @videoTitle = vidTitle; -- this is line 69 

Кроме того, убедитесь, что вы установили DELIMITER, в противном случае ; будет рассматриваться как конец хранимой процедуры.

+0

Фактически, каждый параметр является параметром 'IN' по умолчанию. См. Http://dev.mysql.com/doc/refman/5.6/en/create-procedure.html –

+0

И вы пропустили следующую строку: Задание параметра IN, OUT или INOUT действительна только для ПРОЦЕДУРЫ , Для функции FUNCTION параметры всегда считаются параметрами IN. –

+0

Я не пропустил эту линию; однако вы, очевидно, неправильно понимаете это. Эта строка, говоря иначе, просто заявляет, что вы не можете указывать функции 'OUT' или' INOUT' для функций. –

Смежные вопросы