2009-12-21 2 views
1

Я выполняю спецификацию приложения, которое должно искать таблицу с различными условиями в предложении WHERE.Пользовательские «ГДЕ» в хранимой процедуре (Informix)?

Например (не фактический таблица):

типа 1

select name from employees where active = true; 

или тип 2

select name from employees where idBoss = 3; 

Я предпочел бы создать одну хранимую процедуру с "тип" параметра, чем создайте две хранимые процедуры с тем же кодом и различными предложениями «где».

Возможно ли это?

Примечание: У меня есть 2 программиста; один знает только Informix, знает только .NET. Чтобы свести к минимуму проблемы, я делаю все вызовы в базу данных с хранимыми процедурами, чтобы программист db и программист .net не нуждались друг в друге.

+0

У меня ошибку на ГОТОВИТЬ ... Я Informix 11 может быть версия не поддерживайте его – sergiogx

+0

yup, нет поддержки до 11.5 :( – sergiogx

ответ

2

Вы можете использовать динамический SQL в informix - см. this link для более подробной информации.

DEFINE v_sql VARCHAR(250); 

LET v_sql = "select name from employees"; 

IF IN_PARAMETER = 1 THEN 
    LET v_sql = v_sql || " WHERE active = true" 
ELSE 
    LET v_sql = v_sql || " WHERE idboss = 3" 
END IF; 

PREPARE stmt FROM v_sql; 
EXECUTE stmt; 

FREE stmt; 

Если вы не можете использовать динамический SQL, следующая лучшая вещь будет:

IF IN_PARAMETER = 1 THEN 
    select name from employees WHERE active = true; 
ELSE 
    select name from employees WHERE idboss = 3; 
END IF; 
+0

.mmm Как мне определить и вернуть stmt? – sergiogx

+2

Это лучше, чем хранимая процедура, поскольку вы в меньшей степени зависите от базовой базы данных SQL. Также будьте осторожны с атаками SQL Injection (http://en.wikipedia.org/wiki/SQL_injection), если какие-либо части вашего запроса могут поступать из ненадежных источников. –

+0

Prepa красный SQL в хранимых процедурах доступен как Informix 11.5. – RET

1

Зачем создавать хранимую процедуру для чего-то такого короткого?

Рассмотрите возможность использования Linq. Где только фильтр, который принимает лямбда/функцию, которая возвращает true/false.

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