2015-11-19 62 views
0

创建脚本的存储过程时,我有一个错误,当我在mysql中创建一个存储过程SQL语法错误在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不要工作 –

+0

为什么不直接创建它? – Mihai

回答

0

正确的语法从终端执行SQL脚本是:

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

检查输出也,它显示在测试DB:

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_fieldv_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;