2015-10-28 3 views
0

Я пытаюсь выполнить запрос, который я первым напечатал, как это:же запрос, отличный результат

DELIMITER $$ 

DROP PROCEDURE IF EXISTS development $$ 

CREATE PROCEDURE development() 

BEGIN 
DECLARE i INT DEFAULT 1; 
WHILE i <= 500 DO 
IF NOT EXISTS ((SELECT * FROM customers WHERE customerID = 500)) THEN  INSERT INTO customers (firstName) VALUES (''); END IF; 
SET i = i + 1; 
END WHILE; 
END $$ 

CALL development() $$ 

DROP PROCEDURE IF EXISTS development $$ 

DELIMITER ; 

, но затем «сжатый» в этом:

DELIMITER $$ DROP PROCEDURE IF EXISTS development $$ CREATE PROCEDURE development() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 500 DO IF NOT EXISTS ((SELECT * FROM customers WHERE customerID = 500)) THEN INSERT INTO customers (firstName) VALUES (''); END IF; SET i = i + 1; END WHILE; END $$ CALL development() $$ DROP PROCEDURE IF EXISTS development $$ DELIMITER ; 

на одной линии. Проблема в том, что первый (многострочный) код работает и делает то, что он должен делать, а в другой (однострочной) версии нет. Он не терпит неудачу или бросает ошибки, он просто не вставляет строки, как многострочная версия. Почему это? Что еще более важно, как я могу сделать однострочную версию?

Заранее благодарен!

+0

Каким образом это провал? –

+0

@MichaelBerkowski Это не подводит, он просто не делает того, что он должен делать; то есть добавление 500 строк фиктивных клиентов. – Tice

+0

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

ответ

0

пожалуйста, попробуйте так:

DELIMITER $$ 
DROP PROCEDURE IF EXISTS development $$ CREATE PROCEDURE development() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 500 DO IF NOT EXISTS ((SELECT * FROM customers WHERE customerID = 500)) THEN INSERT INTO customers (firstName) VALUES (''); END IF; SET i = i + 1; END WHILE; END $$ CALL development() $$ DROP PROCEDURE IF EXISTS development $$ 
DELIMITER ; 

Последняя строка перерыв не может быть необходимым.

Но я довольно уверен, что, когда встраивание всего кода, который вы в конечном итоге установки разделители много LONGE чем «$$»

Я просто выполнил полностью встраиваемый пример на случайном SQL сервере моих и всегда получали положительный результат, хотя я не создал связанную структуру db.

с линии ломает есть жалобы отсутствующих таблиц (как и следовало ожидать)

С уважением Стефан

+0

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

0

Вы не можете запустить любой SQL на той же строке, delimiter. delimiter - это встроенная команда клиента mysql, которая устанавливает оператор seperator, а не интерпретатор sql. Он принимает один аргумент, читается до первого пробела или новой строки. Все остальное игнорируется.

delimiter $$ select now() $$ 

Нет выхода, потому что все после $$ выбрасывается.

Или иллюстрируются плохой синтаксис

delimiter "$$" select; nothing order by from nowhere group , oh forget it $$ 
Смежные вопросы