2013-05-26 3 views
0

мне нужно это превращено в хранимой процедуре в моей SQLПреобразовать в хранимую процедуру

SELECT Movie_ID 
FROM Movie 
WHERE MovieName = 'The Matrix' 
AND Shop_ID IN (
    SELECT Shop_ID 
    FROM Shop 
    WHERE Location = 'NY') 

ли я просто пишу

CREATE PROCEDURE SearchQuery(
SELECT Movie_ID 
FROM Movie 
WHERE MovieName = 'The Matrix' 
AND Shop_ID IN (
    SELECT Shop_ID 
    FROM Shop 
    WHERE Location = 'NY') 

Или как? В конце концов, я хочу вызвать процедуру с помощью movieName и StoreLocation, но как мне это сделать?

Процедура должна сказать мне, если фильм в аренду на месте или нет :)

+0

Что должно быть результатом хранимой процедуры? Это Movie_ID? – Mifeet

+0

вы отметили mysql. Я рекомендую вам проверить версию mysql, потому что в прошлом она вызывала проблемы (не очень хорошо поддерживается) – happy

+0

. Результат должен сказать мне, стоит ли снимать фильм на выбранном вами месте. – minde

ответ

1

Следующий запрос возвращает Movie_ID, если есть запись, соответствующая ваш выбор и -1 в противном случае:

CREATE FUNCTION search_query(p_movie_name VARCHAR(255), p_store_location VARCHAR(255)) 
RETURNS BOOL // edit 
BEGIN 
    DECLARE result INT DEFAULT -1; 
    SELECT Movie_ID INTO result 
     FROM Movie 
     WHERE MovieName = p_movie_name AND Shop_ID IN (
      SELECT Shop_ID 
      FROM Shop 
      WHERE Location = p_location); 
    RETURN result <> -1; // edit 
END 

Обратите внимание, что вы должны изменить разделитель запроса на что-то другое чем ;, если вы вводите хранимую процедуру через PhpMyAdmin или используете

DELIMITER // 
CREATE FUNCTION... 

END// 
DELIMITER; 
+0

Как сделать его доступным или нет? – minde

+0

Я обновил ответ, см. Строки, помеченные '// edit' – Mifeet

+0

Итак, теперь он возвращает результат -1, если он недоступен, и что, если это так? – minde

1

Это то, что вы ищете?

DELIMITER // 
CREATE PROCEDURE yourProc(In Movie varchar(100), In Location varchar(100)) 
BEGIN 
    SELECT Movie_ID 
    FROM Movie 
    WHERE MovieName = Movie 
    AND Shop_ID IN (
    SELECT Shop_ID 
    FROM Shop 
    WHERE Location = Location) 
END// 
DELIMITER ; 

Вот некоторые документы по процедурам:

http://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html


EDIT: Для того, чтобы вернуть значение доступны или недоступны из вашей процедуры, вы можете изменить ваш запрос, чтобы использовать LEFT JOIN вместо IN а также добавить оператор CASE, чтобы вернуть соответствующее значение.

Что-то, как это должно работать:

SELECT CASE WHEN S.Location IS NULL THEN 'Unavailable' ELSE 'Available' END 
FROM Movie M 
    LEFT JOIN Shop S ON 
     M.Shop_Id = S.Shop_Id AND 
     S.Location = Loc 
WHERE M.MoveName = Movie 

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

+0

Это возвращается, если фильм доступен или нет? – minde

+0

@MindekMindeki - это возвращает ваш точный запрос. Если Movie_Id существует, он возвращается. Если нет, он возвращает NULL. Если вам нужно вернуть значение, то вы можете легко добавить логику для этого. С наилучшими пожеланиями. – sgeddes

+0

Если я не ошибаюсь, процедура ничего не возвращает, поскольку процедуры никогда ничего не возвращают - вот для чего нужны функции или вам нужен выходной параметр. – Mifeet

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