我在mysql中创建了一个过程,它将模式名称作为参数,并希望从该模式中的表中检索值。 我的程序是
CREATE procedure `get_client_id` (IN p_schema VARCHAR(12), OUT l_client_id VARCHAR(5))
deterministic
BEGIN
declare l_client_id varchar(5);
SET @sql_text = concat('SELECT lookup_value INTO l_client_id FROM ',p_schema,'.lookup_code_detail where lookup_code = ''CLIENT_ID''' );
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
当我打电话给程序时
call get_client_id('SMS',@l_client_id);
抛出此错误
00:11:15 call get_client_id('SMS',@l_client_id) Error Code: 1327. Undeclared variable: l_client_id 0.000 sec
我尝试过创建过程
CREATE procedure `get_client_id` (IN p_schema VARCHAR(12), OUT l_client_id VARCHAR(5))
deterministic
BEGIN
declare l_client_id varchar(5);
declare param_db varchar(5);
set param_db = p_schema;
SELECT concat('schema is ', param_db);
SELECT lookup_value
INTO l_client_id
FROM param_db.lookup_code_detail
where lookup_code = 'CLIENT_ID';
END
但这也会引发错误
00:25:44 call get_client_id('SMS',@l_client_id) Error Code: 1146 Table 'param_db.lookup_code_detail' doesn't exist
答案 0 :(得分:0)
SET @sql_text = concat('SELECT lookup_value INTO l_client_id FROM...
错误代码:1327。未声明的变量:l_client_id
您无法在动态SQL语句中引用过程局部变量。这是因为动态SQL执行对存储过程中的局部变量没有任何访问权限。它就像在不同的范围内执行动态SQL语句一样。
作为一种变通方法,您可以将动态SQL语句的结果存储在会话变量中而不是本地变量中。会话变量具有@
前缀。
SET @sql_text = concat('SELECT lookup_value INTO @l_client_id FROM...
FROM param_db.lookup_code_detail
错误代码:1146表' param_db.lookup_code_detail'不存在
您不能以您的方式使用param_db
变量。变量只能代替标量值,而不能代替标识符。