2010-06-17 4 views
1

INFORMIX-SQL или любой другой SQL на основе БД:Переменные имена таблиц или столбцов

Предположим, у меня есть приложение, где в зависимости от значения некоторых столбцов, пример:

company.code char(3) {abc} 
company.branch char(2) {01} 

Могу ли я построить таблицу имя «abc01» для включения в SELECT * FROM abc01; ? Другими словами, имя переменной таблицы .. тот же вопрос применяется к именам столбцов.

ответ

3

Только на языке, который может манипулировать символьными строками и обрабатывать динамический SQL. Он должен создать заявление «на лету».

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

+0

Можно ли отправить имя таблицы в качестве параметра в функцию и выполнить SELECT? –

+0

@PaulVargas: вроде ... но обычно не очень разумно. Динамический SQL в хранимых процедурах в 11,70 (11,50?) Informix означает, что вы можете это сделать. Проблема заключается в том, «каков тип возвращаемых данных», и как вы возвращаете его с помощью процедуры, которая имеет фиксированную подпись. Для коротких строк и числовых или временных типов вы можете уйти с возвратом VARCHAR (255) и разрешить конверсии с ним; это будет работать. Но он не будет работать для полностью произвольных типов данных - длинных строк и некоторых пользовательских типов и т. Д. Таким образом, ответ «Не совсем, но вы можете попробовать, если хотите». –

2

Только если вы используете динамический sql. Это похоже на то, что вы создаете код sql в своем приложении, а затем используйте что-то вроде немедленного выполнения.

sprintf(cdb_text1, "create table %s (field1 char(3));", usr_db_id); 
EXEC SQL execute immediate :cdb_text; 

Если вы используете динамический sql, это плохо из-за SQL-инъекций.

+1

Динамический SQL, используемый беззаботно, может, безусловно, привести к [SQL Injection] (http://xkcd.org/327), но просто использование Dynamic SQL не является автоматически проблемой. Это зависит от того, насколько вы осторожны. Этот конкретный пример не имеет большого значения; с полем CHAR (3) и CHAR (2), содержащим «пользовательские данные», не так много возможностей для озорства (Old «Robert»), DROP TABLE Students - «просто не вписывается в 5 символов. –

+0

В этом случае это не опасно. Но если я использую Dynamic SQL, мне нужно/знать, что эта возможность существует, правильно? – ksogor

+1

Если источником динамических значений является пользователь, вам необходимо учитывать последствия SQL Injection. Если динамические аспекты сгенерированного SQL являются чисто внутренней бизнес-логикой для программы, то это совершенно другое дело, и вам нужно только рассмотреть, как вы имеете дело с неожиданными/значениями NULL, появляющимися в этих столбцах. Сказав это, если вы обнаружите, что вам нужно это сделать, вы должны бросить критический взгляд на вашу модель данных. Все звучит очень хрупко. – RET

Смежные вопросы