2010-06-04 33 views
17

Por ejemplo, esto no funciona:En MySQL: ¿Cómo pasar un nombre de tabla como procedimiento almacenado y/o argumento de función?

DELIMITER // 
CREATE PROCEDURE countRows(tbl_name VARCHAR(40)) 
    BEGIN 
    SELECT COUNT(*) as ct FROM tbl_name; 
    END // 

DELIMITER ; 
CALL countRows('my_table_name'); 

Produce:

ERROR 1146 (42S02): Table 'test.tbl_name' doesn't exist 

Sin embargo, esto funciona como se esperaba:

SELECT COUNT(*) as ct FROM my_table_name; 

Qué sintaxis necesaria para utilizar un argumento como una nombre de la tabla en una declaración de selección? ¿Esto es posible?

+1

Incluso si esto fuera posible, este no es un camino que deba seguir. Construya s'procs con el sql que realmente desea, o simplemente continúe e incruste el sql ad hoc en su código. – NotMe

+3

@Chris Puedes ver la intención y el poder aquí, ¿no? Pasar el nombre de una tabla a una función genérica. Lo veo como perfectamente legítimo y necesario. ¿Me ayuda a entender por qué es malo controlar un conjunto de resultados desde un sproc? Por lo que dices, si tengo un desarrollador de .NET y un desarrollador de PHP, ¿debería pedirles que escriban su propio código para obtener el mismo conjunto de resultados? –

+0

Veo el intento, y está defectuoso. Le sugiero que lea lo siguiente: http://www.sommarskog.se/dynamic_sql.html Aunque cubre el servidor ms sql, las lecciones son las mismas. – NotMe

Respuesta

24

Prepared statements son lo que necesita.

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40)) 
BEGIN 
SET @t1 =CONCAT('SELECT * FROM ',tab_name); 
PREPARE stmt3 FROM @t1; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 
END $$ 
+0

+1: Usted fue el primero, y correcto - tiene que usar Declaraciones preparadas (SQL dinámico de MySQL): http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html –

+0

rawesome. Un millón de gracias. –

+2

'LLAMAR GetNumRows (gps_location)' Devoluciones: '# 1054 - Columna desconocida 'gps_location' en 'lista de campo'' – Pachonk

Cuestiones relacionadas