在mysql过程中传递模式名称

时间:2017-02-16 00:36:38

标签: mysql stored-procedures

我在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  

1 个答案:

答案 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变量。变量只能代替标量值,而不能代替标识符。