oracle-запрос возвращает 0 записей при передаче аргументов - PullRequest
2 голосов
/ 14 февраля 2011

Когда я запускаю sql следующим образом:

select * from tbl_emp where emp_name like '%%'

Это дает мне все записи.Когда я запускаю его так:

select * from tbl_emp where emp_name like : arg_emp_name

Затем выполните запрос, затем передайте arg_emp_name как '%%', он возвращает 0 записей.Почему это поведение?Спасибо.

Ответы [ 2 ]

5 голосов
/ 14 февраля 2011

Это должно работать нормально.Например, следующее возвращает то же количество записей, что и без where условия

EXEC :arg_emp_name := '%%';

SELECT * FROM ALL_TABLES WHERE TABLE_NAME LIKE  :arg_emp_name

Если вы добавите больше в строку

   EXEC :arg_emp_name := '%ABC%';

   SELECT * FROM ALL_TABLES WHERE TABLE_NAME LIKE  :arg_emp_name

только таблицы с ABC в их имени возвращаются

Однако я хотел бы заметить, что между : и arg_emp_name

нет пробела, наличие которого приводит к ошибке

Error starting at line 4 in command:
SELECT * FROM ALL_TABLES WHERE TABLE_NAME LIKE  : arg_emp_name
Error report:
SQL Error: ORA-01008: not all variables bound
01008. 00000 -  "not all variables bound"
*Cause:    
*Action:
0 голосов
/ 14 февраля 2011

НОВЫЙ ОТВЕТ : -

Из комментариев, полученных для ответа, ясно, что оракул не видит никакой разницы между значениями литералов и переменных привязки.Значение не меняется, как я уже упоминал в моем старом ответе.Ответ @Conard кажется логичным.

СТАРЫЙ ОТВЕТ : -

Когда вы передаете '%%' в качестве аргумента, он буквально воспринимается как строка, и онипотерять особое значение, которое они имеют при использовании в запросе.

Это означает, что запрос будет искать в вашем столбце данные, содержащие '%%', а не обрабатывать их как LIKE.Следовательно, вы получаете 0 записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...