2013-12-17 3 views
1

У меня есть хранимая процедура, которая должна проверять, добавляется ли художник в таблицу Allowed Nationality, но она не работает. Код вставляет исполнителя, находятся ли они в таблице Allowed Nationality или нет. Может ли кто-нибудь сказать мне, что я сделал неправильно?хранимая процедура в SQL

DELIMITER // 
CREATE PROCEDURE `InsertNewArtistCheck` 
    (IN newLastName Char(25), 
    IN newFirstName Char(25), 
    IN newNationality Char(30), 
    IN newDateOfBirth Numeric(4), 
    IN newDateDeceased Numeric(4)) 
BEGIN 
DECLARE varRowCount Int; 
    SELECT Nation INTO varRowCount 
    FROM ALLOWED_NATIONALITY 
    WHERE Nation = newNationality; 

    IF (varRowCount < 0) 
    THEN 
     ROLLBACK; 
      SELECT 'Nationality Not Allowed' AS ErrorMessage; 
    END IF; 
    INSERT INTO ARTIST (LastName, FirstName, Nationality, 
         DateOfBirth, DateDeceased) 
       VALUES (newLastName, newFirstName, newNationality, 
         newDateOfBirth, newDateDeceased); 
    SELECT 'New artist data added to database' AS InsertStatus; 
END// 
DELIMITER ; 
+0

Является ли Nation символом 'char (30)' или 'varchar (30)' в определении таблицы? Если это «varchar (30)», то по крайней мере часть проблемы связана с конечными пробелами. – NotMe

ответ

0

будет закрыт, все еще ....

Смотрите эту строку:

IF (varRowCount < 0)

Скажите, при каких условиях вы думаете SQL Сервер когда-либо вернет НЕГАТИВНОЕ количество строк?

Должно быть равно 0, не менее.

+0

Не закрыт - мигрировал! – mfinni

+0

И это MySQL не SQL Server –

+0

Замечу, что он не выбирает количество строк, он выбирает значение столбца, которое может быть отрицательным. –

1

Попробуйте следующие изменения:

DECLARE varRowCount Int; 

     SELECT count(*) INTO varRowCount 
     FROM ALLOWED_NATIONALITY 
     WHERE Nation = newNationality; 

     IF (varRowCount < 1) 
     THEN 
      ROLLBACK; 
      SELECT 'Nationality '+newnationality+' not Allowed' AS ErrorMessage; 
      RETURN 
     END IF; 

Вы пытаетесь поставить значение символа (Nation) в числовой переменной (varRowCount). То, что вы действительно хотите, - это определить количество наций (надеюсь, 1), которые соответствуют нации нового художника. Вам также не нужен оператор ROLLBACK, так как хранимая процедура ничего не сделала для «отмены»

+0

Ну, откат был бы действительным, если бы у него была открытая транзакция на более высоком уровне, но при этом должным образом была выделена новая область транзакции, если это так, и тогда откат будет действительным, чтобы аннулировать любую родительскую транзакцию, которая может быть открытый. –

+0

Кроме того, в большинстве случаев вместо того, чтобы производить COUNT (*), который является дорогостоящим/жадным, простой выбор для конкретного (проиндексированного) столбца и NULL-проверка результата будут работать лучше. –

+1

Я согласен с тобой, Шон, но иногда мне нравится свести изменения к минимуму, чтобы упростить их ... – Sparky

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