у вас есть в основном 2 варианта.
1. Используйте динамический запрос
2. Используйте коллекции
- С помощью динамического запроса вы динамически создаете запрос во время выполнения и затем запускаете его:
DECLARE
v_filename VARCHAR2(300) := '(''ALL_VIEWS'', ''ALL_TABLES'')';
--double quotes inside a string
cnt NUMBER;
BEGIN
execute immediate 'SELECT COUNT(*) INTO :cnt FROM all_views
WHERE view_name IN ' || v_filename
into cnt;
dbms_output.put_line('counted: ' || cnt);
END;
/
Преимущества: легко писать, особенно для коротких запросов, быстро
Недостатки: возможен SQL INJECTION в случаях, когда вы неправильно вставляете пользовательский ввод в строку запроса, жесткий анализ каждый раз при изменении списка имен файлов
- Используйте коллекции. Вы создаете тип коллекции, затем заполняете ее и используете в качестве псевдотаблицы.
create type tt_strings as table of varchar2(30);
declare
cnt NUMBER;
v_condition tt_strings;
begin
v_condition := tt_strings();
v_condition.extend;
v_condition(1) := 'ALL_VIEWS';
v_condition.extend;
v_condition(2) := 'ALL_TABLES';
SELECT COUNT(*)
INTO cnt
FROM all_views o, TABLE(v_condition) x
WHERE x.column_value = o.VIEW_NAME;
dbms_output.put_line('counted: ' || cnt);
end;
/
Преимущества: Безопасный, обслуживаемый для больших коллекций с более чем 2 элементами
Недостатки: вам нужно создать тип, сложнее для кодирования (сначала), немного медленнее (что в 99% случаев не имеет значения)