0

我已经为不同的表格(比如国家和部门)创建了一个更新程序。在过程中,我已经提到了表名的输入参数以及其他参数。但不幸的是我得到了一个错误。这是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

请帮我。提前感谢

4

2 回答 2

1

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

您必须使用动态 SQL 来实现您的目标。阅读有关准备好的语句的 SQL 语法主题的更多信息

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

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演示

于 2013-06-18T05:20:13.217 回答
0

过程语法似乎有一些错误

错误的一个: 1. SELECT Name from *tbl_name* where Name = tbl_column_new_value) 然后
SET msg := '1'

在上面的代码行中,您没有为 tal_name 设置任何值;

您可以在查询中将以下语法集中在 INTO 上: CREATE OR REPLACE PROCEDURE 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 ) 开始

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

结尾;

于 2013-06-18T05:23:59.940 回答