我为不同的表创建了一个更新程序,例如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提前
答案 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)然后在上面的代码行中,您没有为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;