Правильное использование переменных связывания с датами в Oracle? - PullRequest
2 голосов
/ 26 января 2012

Я озадачен правильным использованием переменных связывания с date в Oracle. Это не внутри базы данных или при использовании PL / SQL, а скорее при взаимодействии с Oracle через интерфейс OCI, где дату нужно передать в виде строки, используя функцию to_date .

Я бы подумал, что правильный подход для обеспечения правильного использования переменных связывания заключается в следующем:

to_date(:my_date, :my_date_format)

Однако я видел подходы, в которых формат даты не выполняется с использованием привязок, поэтому я немного растерялся.

Кто-нибудь может подтвердить это или предложить лучший подход?

Ответы [ 2 ]

1 голос
/ 26 января 2012

Является ли формат даты постоянной?Или он изменяется во время выполнения?

Обычно вы знаете, в каком формате (как минимум, ожидается) будет строка, чтобы формат даты был константой.Если что-то является константой, нет необходимости делать это переменной связывания, это может быть просто жестко закодировано как часть выражения.В этом случае это не имеет значения в любом случае, но в некоторых случаях вы бы предпочли, чтобы значение было жестко закодировано в операторе SQL, потому что вы хотите дать оптимизатору больше информации (например, столбец с сильно искаженными данными, где вывсегда ищем определенное жестко закодированное значение).

С другой стороны, если формат даты изменяется во время выполнения, потому что кто-то передает и строковое представление даты, и формат, в котором находится строкаВаша процедура, имеет смысл, чтобы формат даты был переменной связывания.

0 голосов
/ 26 января 2012

Ответ на ваш вопрос таков:

Если вы динамически создаете свой date_format, то вам следует использовать переменную bind, чтобы обезопасить себя от SQL-инъекций.Если вы не создаете динамически формат даты, то он уже жестко запрограммирован, и в этом нет особого смысла.

select to_date(:my_date,'yyyymmdd') from dual

в любом случае безопасен, но:

select to_date(:my_date,:my_date_format) from dual

действительно должно бытьbind.

Все это предполагает, что: my_date не является столбцом, в этом случае он вообще не может быть переменной bind.

Если вы связываете :my_date, хотя выПередавая статическую дату в Oracle и не используя столбец, OCI не сможет решить эту проблему без обращения к Oracle (точно не знаю, никогда не использовал).

...