Он работает для тривиальных случаев, и вы можете расширить его с помощью «автоматической генерации подготовленного заявления», однако он всегда имеет свои пределов.
Подход in () может быть достаточно хорош для некоторых случаев, но не для защиты от ракеты:)
Ракетно-защитное решение состоит в том, чтобы передать произвольное количество параметров в отдельный вызов (например, путем передачи клока параметров), а затем иметь представление (или любой другой способ) для представления их в SQL и использовать в вашем месте критерии.
Вариант грубой силы здесь http://tkyte.blogspot.hu/2006/06/varying-in-lists.html
Однако, если вы можете использовать PL / SQL, этот беспорядок может стать довольно опрятным.
function getCustomers(in_customerIdList clob) return sys_refcursor is
begin
aux_in_list.parse(in_customerIdList);
open res for
select *
from customer c,
in_list v
where c.customer_id=v.token;
return res;
end;
Затем вы можете передать произвольное количество идентификаторов клиентов, разделенных запятыми, в параметре и:
Трюк здесь:
Вид выглядит так:
create or replace view in_list
as
select
trim( substr (txt,
instr (txt, ',', 1, level ) + 1,
instr (txt, ',', 1, level+1)
- instr (txt, ',', 1, level) -1 ) ) as token
from (select ','||aux_in_list.getpayload||',' txt from dual)
connect by level <= length(aux_in_list.getpayload)-length(replace(aux_in_list.getpayload,',',''))+1
, где aux_in_list.getpayload ссылается на исходную строку ввода.
Возможным подходом было бы передать массивы pl / sql (поддерживаемые только Oracle), однако вы можете ' t использовать их в чистом SQL, поэтому шаг преобразования всегда необходим. Преобразование не может быть выполнено в SQL, поэтому, в конце концов, самым эффективным решением является передача clob со всеми параметрами в строке и преобразование его в представление.
Для запросов как это всегда лучше использовать INFORMATION_SCHEMA
представление. Эти представления являются (главным образом) стандартными через многие различные базы данных и редко изменяются от версии до версии.
, Чтобы проверить, существует ли таблица использование:
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'TheSchema'
AND TABLE_NAME = 'TheTable'))
BEGIN
--Do Stuff
END
Мы всегда используем эти OBJECT_ID
стиль столько, сколько я помню
IF OBJECT_ID('*objectName*', 'U') IS NOT NULL
Используя Информационную схему Стандарт SQL способ сделать это, таким образом, это должно использоваться всеми базами данных, которые поддерживают его.
If you need to work on different databases:
DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'
DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'
DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = @Catalog
AND TABLE_SCHEMA = @Schema
AND TABLE_NAME = @Table))
BEGIN
--do stuff
END
также обратите внимание, что если по какой-либо причине вам нужно проверить на наличие временной таблицы, вы можете сделать это:
if OBJECT_ID('tempdb..#test') is not null
--- temp table exists