У меня есть хранимая процедура, которая принимает несколько параметров (например, 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-инъекций...