调用mySql过程时出错

时间:2013-06-18 04:42:54

标签: java mysql

我为不同的表创建了一个更新程序,例如country&部门。 在程序中我已经提到了表名的输入参数以及其他参数。 但不幸的是我收到了一个错误。这是mySql程序:

CREATE DEFINER=`satish`@`%` PROCEDURE `p_update_Master_Name`(
IN tbl_Name VARCHAR(35),
IN tbl_column_old_value VARCHAR(35),
IN tbl_column_new_value VARCHAR(35),
IN tbl_user_id INT,
OUT msg INT 
)
BEGIN
IF EXISTS (SELECT Name from tbl_name where Name = tbl_column_new_value) then        
SET msg := '1';
-- failed case  

else

UPDATE tbl_name SET Name= tbl_column_value, Modified_Date=now(),       Modified_by=tbl_user_id where Name = tbl_column_old_value;
set msg := '0';
-- success 
END IF;
END

我从java文件调用此过程。

CallableStatement cs = conn.prepareCall("{ call p_update_Master_Name(?,?,?,?,?)}");
            cs.setString(1, "country");
    cs.setString(2, real);
    cs.setString(3, mod);   
    cs.setInt(4, 01);
    cs.execute();
            cs.registerOutParameter(5, Types.INTEGER);
            int i=cs.getInt(5);

但它给了我一个mysql.jdbc异常。

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'sims.tbl_name' doesn't 
exist

请帮帮我。 Thanx提前

2 个答案:

答案 0 :(得分:1)

您无法使用变量在静态SQL查询中定义表或列(或任何其他db对象)名称。他们应该是文字。

您必须使用动态SQL来实现目标。详细了解主题SQL Syntax for Prepared Statements

您的存储过程可能看起来像

DELIMITER $$
CREATE PROCEDURE p_update_Master_Name
(
    IN tbl_Name VARCHAR(35),
    IN tbl_column_old_value VARCHAR(35),
    IN tbl_column_new_value VARCHAR(35),
    IN tbl_user_id INT,
    OUT msg INT 
)
BEGIN
    SET @sql = CONCAT('SELECT (COUNT(*) > 0) INTO @result FROM ', tbl_name, ' WHERE Name = \'', tbl_column_new_value, '\'');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;

    SET msg = @result;

    IF @result = 0 THEN
      SET @sql = CONCAT('UPDATE ', tbl_name, 
                        ' SET Name = \'', tbl_column_new_value, 
                        '\', Modified_Date = NOW(), Modified_by = ', tbl_user_id, 
                        ' WHERE Name = \'', tbl_column_old_value, ' \'');
      PREPARE stmt FROM @sql;
      EXECUTE stmt;
    END IF;
    DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

这是 SQLFiddle 演示

答案 1 :(得分:0)

程序语法似乎有一些错误

错误的一个:  1.从 * tbl_name * 中选择名称,其中Name = tbl_column_new_value)然后
SET msg:='1'

在上面的代码行中,您没有为tal_name;

设置任何值

您可以在查询中引用以下语法专注于INTO: 创建或替换程序getDBUSERByUserId(            p_userid IN DBUSER.USER_ID%TYPE,            o_username OUT DBUSER.USERNAME%TYPE,            o_createdby OUT DBUSER.CREATED_BY%TYPE,            o_date OUT DBUSER.CREATED_DATE%TYPE) IS BEGIN

SELECT USERNAME,CREATED_BY,CREATED_DATE    INTO o_username,o_createdby,o_date   FROM DBUSER WHERE USER_ID = p_userid;

END;