Привязка параметров к Oracle Dynamic SQL

У меня есть хранимая процедура, которая принимает несколько параметров (например, pName, pHeight, pTeam)

У меня есть такой запрос:

SQLQuery VARCHAR2(6000);
TestCursor T_CURSOR;

SQLQuery := 'SELECT ID, Name, Height, Team FROM MyTable WHERE ID IS NOT NULL ';


-- Build the query based on the parameters passed.
IF pName IS NOT NULL
  SQLQuery := SQLQuery || 'AND Name LIKE :pName ';
END IF;

IF pHeight IS > 0
  SQLQuery := SQLQuery || 'AND Height = :pHeight ';
END IF;

IF pTeam IS NOT NULL
  SQLQuery := SQLQuery || 'AND Team LIKE :pTeam ';
END IF;


OPEN TestCursor FOR SQLQuery USING pName, pHeight, pTeam;

Если я выполняю процедуру передавая все параметры, он работает правильно.

Но если я передал только один или два параметра, процедура выдаст ошибку:

ORA-01006: bind variable does not exist

Как выборочно связать переменную с параметрами в зависимости от того, где использовалось значение параметра? Например, если бы было передано только pName, я бы выполнил только запрос:

OPEN TestCursor FOR SQLQuery USING pName;

Или, если бы были переданы и pName, и pTeam, то:

OPEN TestCursor FOR SQLQuery USING pName, pTeam;

Надеюсь, кто-нибудь сможет найти другие способы решения этой проблемы. Спасибо.

Редактировать: На самом деле я мог бы использовать следующее:

-- Построить запрос на основе переданных параметров. ЕСЛИ pName НЕ НУЛЕВОЕ SQLQuery := SQLQuery || 'И Имя НРАВИТСЯ''' || пИмя || ''' '; КОНЕЦ ЕСЛИ;

IF pHeight IS > 0
  SQLQuery := SQLQuery || 'AND Height = pHeight ';
END IF;

IF pTeam IS NOT NULL
  SQLQuery := SQLQuery || 'AND Team LIKE ''' || pTeam || ''' ';
END IF;


OPEN TestCursor FOR SQLQuery;

Но это будет ОЧЕНЬ уязвимо для SQL-инъекций...

7
задан Batuta 12 June 2012 в 20:01
поделиться