2017-02-16 11 views
1

Я создал процедуру в mysql, которая берет имя схемы в качестве параметра и хочет вернуть значение из таблицы в этой схеме. моя процедураПередача имени схемы в процедуре 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 

, но это также t hrows ошибка

00:25:44 call get_client_id('SMS',@l_client_id) Error Code: 1146 Table 'param_db.lookup_code_detail' doesn't exist 

ответ

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 переменную в пути вы делаете. Переменные могут заменять только скалярные значения, а не идентификаторы.