Trong thư viện giao tiếp cơ sở dữ liệu của tôi jOOQ, tôi muốn thêm hỗ trợ cho các gói Oracle (hoặc DB2, v.v.). Tôi đã thực hiện việc lưu trữ thủ tục/chức năng hỗ trợ mà mọi đối tượng được lưu trữ được mô hình hóa như một lớp Java được tạo ra. Ví dụ, chức năng lưu trữ nàyÁnh xạ giữa các gói Oracle và các gói Java
CREATE FUNCTION f_author_exists (author_name VARCHAR2) RETURNS NUMBER;
sẽ tạo ra một lớp có thể được sử dụng như thế này (lưu ý, cũng có rất nhiều phương pháp thuận tiện, ví dụ này chỉ cho thấy thiết kế chung):
// A new "function call instance". The function needs to be instanciated
// once per call
FAuthorExists f = new FAuthorExists();
// Set the function parameters on the call instance and call it
f.setAuthorName("Paulo");
f.execute(connection);
// Fetch the result from the function call instance
BigDecimal result = f.getReturnValue();
Lý do tôi chọn một hàm SQL ánh xạ ->Java Class là vì các thủ tục được lưu trữ cho phép các giá trị trả về phức tạp (một số tham số OUT hoặc OUT OUT) mà tôi muốn có thể lấy từng cái một sau khi gọi thủ tục:
p.getOutParam1();
p.getOutParam2();
Thiết kế này hoạt động tốt với các chức năng/thủ tục được lưu trữ, nơi không thể quá tải quá tải. Trong gói của Oracle (hoặc DB2 của), tuy nhiên, tôi có thể có một số chức năng có cùng tên, như
CREATE PACKAGE my_package IS
FUNCTION f_author_exists (name VARCHAR2) RETURNS NUMBER;
FUNCTION f_author_exists (name VARCHAR2, country VARCHAR2) RETURNS NUMBER;
END my_package;
Khi tôi tạo ra một lớp cho mỗi chức năng (hoặc thủ tục), tôi sẽ có cuộc đụng độ đặt tên với một số FAuthorExists
lớp Java . Giải pháp lame là thêm chỉ mục vào tên lớp, chẳng hạn như FAuthorExists2
, FAuthorExists3
. Một giải pháp lame khác là tạo ra một số giá trị băm (hoặc bản thân giá trị) từ các tên/kiểu tham số trực tiếp vào tên lớp, chẳng hạn như FAuthorExistsVARCHAR2
, FAuthorExistsVARCHAR2VARCHAR2
. Không giải pháp nào là mong muốn vì lý do rõ ràng.
Có ai có giải pháp đơn giản cho vấn đề này không? Hoặc có lẽ một ý tưởng về một thiết kế tổng thể tốt hơn mà sẽ không tạo ra các vấn đề quá tải tên chức năng như vậy?
Bất kỳ phản hồi nào được đánh giá cao!
Phương thức 'execute()' thực hiện cuộc gọi thực tế. Phương thức này được gọi là 'setName()' vì đối số hàm 'name'. Tôi đã sửa nó trong ví dụ, để làm cho nó rõ ràng hơn. Ý tưởng của bạn không phải là một ý tưởng tồi. Mặc dù, vấn đề là nếu bạn có quá tải tên hàm với các bộ đối số rất riêng biệt, thì nó có thể trở nên khó hiểu để tìm ra, kết hợp các đối số nào là có thể. Nhưng với các phương pháp tiện lợi, điều đó có thể thực sự hiệu quả! 1 cho ý tưởng xác định cuộc gọi chính xác tại thời gian chạy –
@Lukas khớp với các loại đối số thay vì tên là ý tôi muốn nói - tôi nghĩ nó có thể đơn giản hơn. Dù vậy, tôi nghĩ có thể là nguyên tắc có thể. –
Thật dễ dàng để tìm thấy một thực hiện tốt về cách gọi hàm dựa trên tên/loại/vị trí đối số. Nhưng phần khó khăn là làm cho mã được tạo dễ sử dụng cho các nhà phát triển. Đó là lý do tại sao tôi sử dụng tên của đối số trong các phương thức đã tạo –