2010-04-04 2 views
0

У меня есть благородные предшественники хранимой процедура:родового Mysql хранимой процедура

CREATE PROCEDURE `get`(IN tb VARCHAR(50), IN id INTEGER) 
BEGIN 
    SELECT * FROM tb WHERE Indx = id; 
END// 

Когда я звоню получить (пользователь, 1) я получаю следующее:

ERROR 1054 (42S22): Unknown column 'user' in 'field list' 
+2

Это просто не сработает. Вам нужно будет использовать подготовленные операторы, если вы хотите использовать имя динамической таблицы. Однако я не думаю, что в этом случае есть смысл иметь хранимую процедуру в первую очередь. –

ответ

2

Вы не можете использовать переменную в качестве имени таблицы в SQL, потому что она компилирует это в том случае, когда процедура компилируется. Попробуйте использовать подготовленные отчеты:

CREATE PROCEDURE `get`(IN tb VARCHAR(50), IN id INTEGER) 
BEGIN 
    PREPARE stmt1 FROM CONCAT('SELECT * FROM ', tb, ' WHERE Indx = id'); 
    EXECUTE stmt1; 
    DEALLOCATE PREPARE stmt1; 
END// 

Обратите внимание, что это будет медленнее.

+1

Как насчет внедрения SQL? Это безопасно? Я не вижу никаких мер безопасности против него, «tb» может быть любым, например, подзапросом. –

0

вы можете назвать его как get('user',1)?

IN tb VARCHAR(50) заставляет его ожидать «строку», вы передаете что-то, что интерпретатор SQL интерпретирует как поле user, и это не известно.