Моето лично предпочитание е да направя променливите за обвързване символни низове (VARCHAR2) и да оставя на Oracle да направи преобразуването от знак в свой собствен формат за вътрешно съхранение. Достатъчно лесно е (на C) да получите стойности на данни, представени като низове с нулев край, в приемлив формат.
Така че, вместо да пишете SQL така:
SET MY_NUMBER_COL = :b1
, MY_DATE_COL = :b2
Пиша SQL така:
SET MY_NUMBER_COL = TO_NUMBER( :b1 )
, MY_DATE_COL = TO_DATE( :b2 , 'YYYY-MM-DD HH24:MI:SS')
и предоставя символни низове като свързващи променливи.
Този подход има няколко предимства.
Едната е, че заобикаля проблемите и грешките, които човек среща при обвързването на други типове данни.
Друго предимство е, че стойностите на свързване са по-лесни за дешифриране при проследяване на събитие 10046 на Oracle.
Освен това ПЛАН ЗА ОБЯСНЕНИЕ (вярвам) очаква всички променливи за свързване да бъдат VARCHAR2, така че това означава, че операторът, който се обяснява, е малко по-различен от действителния оператор, който се изпълнява (поради неявните преобразувания на данни, когато типовете данни на аргументите за свързване в действителния операторът не е VARCHAR2.)
И (по-малко важно), когато тествам израза в TOAD, е по-лесно просто да мога да въвеждам низове в полетата за въвеждане и не трябва да се занимавам с промяна на типа данни в поле с падащ списък.
Оставям също така функциите TO_NUMBER и TO_DATE да потвърдят данните. (Поне в по-ранните версии на Oracle се сблъсках с проблеми с директното обвързване на стойност DATE и тя заобикаляше (поне част от) проверката за валидност и позволяваше невалидни стойности за дата да се съхраняват в базата данни.
Това е само лично предпочитание, базирано на минал опит. Използвам същия подход с Perl DBD.
Чудя се какво има да каже Том Кайт (asktom.oracle.com) по тази тема?