Вам нужно построить запрос так, чтобы он всегда ссылался на: b и: c примерно так:
sqlquery := 'SELECT * FROM table WHERE a_col = a';
IF b IS NOT NULL THEN
sqlquery := sqlquery || ' AND b_col = :b';
ELSE
sqlquery := sqlquery || ' AND :b IS NULL';
END IF;
IF c IS NOT NULL THEN
sqlquery := sqlquery || ' AND c_col = :c';
ELSE
sqlquery := sqlquery || ' AND :c IS NULL';
END IF;
Тогда вы можете использовать его так:
OPEN cur FOR sqlquery USING b, c;
На самом делеЯ думаю, что было бы более эффективно сделать это:
sqlquery := 'SELECT * FROM table WHERE a_col = a';
IF b IS NOT NULL THEN
sqlquery := sqlquery || ' AND b_col = :b';
ELSE
sqlquery := sqlquery || ' AND (1=1 OR :b IS NULL)';
END IF;
IF c IS NOT NULL THEN
sqlquery := sqlquery || ' AND c_col = :c';
ELSE
sqlquery := sqlquery || ' AND (1=1 OR :c IS NULL)';
END IF;
... потому что тогда оптимизатор может признать, что 1 = 1 всегда верно, и поэтому может полностью исключить этот предикат из рассмотрения.Я помню, что читал это где-то (статья Тома Кайта в Oracle Mag, я думаю), но сейчас не могу найти ссылку.