2015-11-19 3 views
0

У меня есть ошибки при создании хранимой процедуры в MySQLSQL ошибка синтаксиса при создании хранимой процедуры сценария в MYSQL

delimiter // 

CREATE PROCEDURE insertvaluefield(IN p_field INT) 
BEGIN 
    DECLARE v_type VARCHAR(80) DEFAULT ''; 
    SELECT type_field 
    FROM Field 
    WHERE id_field = p_field 
    LIMIT 1; 
    IF v_type IN ('text', 'textarea') THEN 
     DELETE FROM ValueField 
     WHERE field_valuefield = p_field; 
    END IF; 
END; 
// 
delimiter ; 

Я делаю это, чтобы сохранить эту процедуру в моей базе данных:

mysql -uXXXX -pXXXX DataBase < script.sql 

Это ошибка результат:

ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE PROCEDURE insertvaluefield(IN p_field INT) BEGIN DECLARE v_ty' at line 1 
+0

вы можете имя базы данных путь через флаг '-D' (пример: 'mysql -uXXXX -pXXXX -DDataBase

+0

Я пытаюсь с опцией D, это di dn't тоже работает –

+0

Почему вы не создаете его напрямую? – Mihai

ответ

0

Правильный синтаксис для выполнения SQL-скрипт из терминала является:

mysql -uXXXX -pXXXX -e "use your_db_name; source path_to_sql_file/script.sql;"

Проверьте выход также, он показывает в тесте БД:

mysql> show procedure status;

+------+------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+------- ---------------+--------------------+ 
| Db | Name    | Type  | Definer  | Modified   | Created    | Security_type | Comment | character_set_client | collation_connection | Database Collation | 
+------+------------------+-----------+----------------+-------------------- -+---------------------+---------------+---------+----------------------+----------------------+--------------------+ 
| test | insertvaluefield | PROCEDURE | [email protected] | 2015-11-19 21:18:34 | 2015-11-19 21:18:34 | DEFINER  |   | utf8     | utf8_general_ci  | latin1_swedish_ci | 
+------+------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+ 
+0

Я пытаюсь использовать этот метод следующим образом: mysql -uXXXX -pXXXX -e «использовать WorkApplication; source ./proc.sql;», но у меня все еще такая же ошибка: /, Я пытаюсь запустить этот скрипт после подключения на mysql он тоже не работал –

+0

Я только что скопировал ваш код SQL и создал файл 'script.sql', и он работает нормально. –

0

Я не могу воспроизвести проблему. В моем случае все работает так, как ожидалось.

Не забудьте назначить type_field для v_type:

... 
-- SELECT `type_field` 
SELECT `type_field` INTO `v_type` 
... 

Файл: /path/to/file/script.sql

USE `test`; 

DELIMITER // 

SELECT DATABASE()// 

DROP TABLE IF EXISTS `Field`// 
DROP PROCEDURE IF EXISTS `insertvaluefield`// 

CREATE TABLE `Field` (
    `id_field` INT, 
    `type_field` VARCHAR(80) 
)// 

CREATE PROCEDURE `insertvaluefield`(IN `p_field` INT) 
BEGIN 
    DECLARE `v_type` VARCHAR(80) DEFAULT ''; 
    -- SELECT `type_field` 
    SELECT `type_field` INTO `v_type` 
    FROM `Field` 
    WHERE `id_field` = `p_field` 
    LIMIT 1; 
    IF `v_type` IN ('text', 'textarea') THEN 
     /* 
     DELETE FROM ValueField 
     WHERE field_valuefield = p_field; 
     */ 

     /* TEST CASE */ 
     SELECT CONCAT(' 
        DELETE FROM `ValueField` 
        WHERE `field_valuefield` = ', `p_field`, '; 
       ') `DELETE`; 
    END IF; 
END// 

INSERT INTO `Field` 
    (`id_field`, `type_field`) 
VALUES 
    (1, 'text'), 
    (2, 'textarea')// 

DELIMITER ; 

CALL `insertvaluefield`(1)\G 
CALL `insertvaluefield`(2)\G 

Тест:

$ mysql -u XXXX -p < /path/to/file/script.sql 
Enter password: 
DATABASE() 
test 
*************************** 1. row *************************** 
DELETE: 
        DELETE FROM `ValueField` 
        WHERE `field_valuefield` = 1; 

*************************** 1. row *************************** 
DELETE: 
        DELETE FROM `ValueField` 
        WHERE `field_valuefield` = 2; 
Смежные вопросы