2010-06-04 8 views
17

Na przykład, to nie zadziała:W MySQL: Jak przekazać nazwę tabeli jako procedura składowana i/lub argument funkcji?

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

DELIMITER ; 
CALL countRows('my_table_name'); 

Produkuje:

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

Jednak to działa zgodnie z oczekiwaniami:

SELECT COUNT(*) as ct FROM my_table_name; 

Jakie składnia jest wymagane użycie argumentu jako nazwa tabeli w instrukcji select? Czy to możliwe?

+1

Nawet jeśli było to możliwe, nie jest to ścieżka, którą należy zejść. Zbuduj s'procs za pomocą sql, którego naprawdę potrzebujesz, lub po prostu włącz i wyłóż kod SQL ad hoc w swoim kodzie. – NotMe

+3

@Chris Tutaj widać intencje i moc, prawda? Przekazywanie nazwy tabeli do ogólnej funkcji. Uważam to za całkowicie uzasadnione i potrzebne. Pomóż mi zrozumieć, dlaczego źle kontrolować zestaw wyników ze sproc? Z tego, co mówisz, jeśli mam programistę .NET i programistę PHP, powinienem poprosić ich o napisanie własnego kodu, aby uzyskać ten sam zestaw wyników? –

+0

Widzę intencję i jest ona wadliwa. Sugeruję, aby przeczytać następujące: http://www.sommarskog.se/dynamic_sql.html Chociaż obejmuje serwer ms sql, lekcje są takie same. – NotMe

Odpowiedz

24

Prepared statements są tym, czego potrzebujesz.

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: Byłeś pierwszy i poprawny - musisz użyć Przygotowanych stwierdzeń (dynamiczny SQL MySQL): http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html –

+0

Niesamowite. Stukrotne dzięki. –

+2

'WEJŚCIE GetNumRows (położenie_ps)' Zwroty: '# 1054 - Nieznana kolumna 'lokalizacja_gps' w 'liście pól'' – Pachonk

Powiązane problemy