Sở thích cá nhân của tôi là tạo chuỗi ký tự biến liên kết (VARCHAR2) và để Oracle thực hiện chuyển đổi từ ký tự sang định dạng lưu trữ nội bộ của riêng nó. Thật dễ dàng (trong C) để nhận các giá trị dữ liệu được biểu thị dưới dạng chuỗi kết thúc bằng null, ở định dạng có thể chấp nhận được.
Vì vậy, thay vì viết SQL như thế này:
SET MY_NUMBER_COL = :b1
, MY_DATE_COL = :b2
Tôi viết SQL như thế này:
SET MY_NUMBER_COL = TO_NUMBER( :b1 )
, MY_DATE_COL = TO_DATE( :b2 , 'YYYY-MM-DD HH24:MI:SS')
và cung cấp các chuỗi ký tự làm biến liên kết.
Có một số ưu điểm của cách tiếp cận này.
Một là giải pháp khắc phục các sự cố và lỗi mà chúng ta gặp phải khi liên kết các kiểu dữ liệu khác.
Một ưu điểm khác là các giá trị ràng buộc dễ giải mã hơn trên dấu vết sự kiện Oracle 10046.
Ngoài ra, KẾ HOẠCH GIẢI THÍCH (tôi tin rằng) mong đợi tất cả các biến ràng buộc là VARCHAR2, do đó, điều đó có nghĩa là câu lệnh được giải thích hơi khác so với câu lệnh thực tế đang được thực thi (do chuyển đổi dữ liệu ngầm định khi các kiểu dữ liệu của các đối số ràng buộc trong thực tế câu lệnh không phải là VARCHAR2.)
Và (ít quan trọng hơn) khi tôi đang kiểm tra câu lệnh trong TOAD, sẽ dễ dàng hơn để có thể nhập chuỗi vào các hộp nhập và không phải thay đổi kiểu dữ liệu trong hộp danh sách thả xuống.
Tôi cũng để các hàm TO_NUMBER và TO_DATE buitin xác thực dữ liệu. (Ít nhất trong các phiên bản trước của Oracle, tôi đã gặp phải sự cố liên kết trực tiếp giá trị DATE và nó đã bỏ qua (ít nhất một số) kiểm tra tính hợp lệ và cho phép các giá trị ngày không hợp lệ được lưu trữ trong cơ sở dữ liệu.
Đây chỉ là sở thích cá nhân, dựa trên kinh nghiệm trong quá khứ. Tôi sử dụng cùng cách tiếp cận này với Perl DBD.
Tôi tự hỏi Tom Kyte (asktom.oracle.com) nói gì về chủ đề này?