데이터베이스 인터페이스 라이브러리 jOOQ에서 Oracle (또는 DB2 등) 패키지에 대한 지원을 추가하고 싶습니다. 모든 저장된 객체가 생성 된 Java 클래스로 모델링 된 저장 프로 시저/함수 지원을 이미 구현했습니다. 예를 들어,이 저장 기능을 위해Oracle 패키지와 Java 패키지 간의 매핑
CREATE FUNCTION f_author_exists (author_name VARCHAR2) RETURNS NUMBER;
는 다음과 같이 사용할 수있는 클래스를 생성합니다 (참고, 편리한 메소드 많이,이 예제 그냥 일반적인 디자인을 보여줍니다도 있습니다) :
// 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();
내가 SQL 함수 ->자바 클래스 매핑을 선택한 이유는 저장 프로 시저가 프로 시저를 호출 한 후 하나씩 가져올 수있는 복잡한 반환 값 (여러 OUT 또는 IN OUT 매개 변수)을 허용하기 때문입니다.
p.getOutParam1();
p.getOutParam2();
지금이 디자인은 오버로드 수없는 저장 함수/프로 시저와 잘 작동합니다. 오라클의 (또는 DB2의) 패키지 내에서, 그러나, 나는
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;
나는 기능 (또는 절차) 당 클래스를 생성, 나는 몇 가지 FAuthorExists
자바 클래스와 이름 충돌을 것 같은, 같은 이름으로 여러 기능을 가질 수있다 . 불완전한 솔루션은 FAuthorExists2
, FAuthorExists3
과 같은 클래스 이름에 인덱스를 추가하는 것입니다. 또 다른 절름발이 솔루션은 매개 변수 이름/유형에서 일종의 해시 값 (또는 값 자체)을 FAuthorExistsVARCHAR2
, FAuthorExistsVARCHAR2VARCHAR2
과 같은 클래스 이름으로 직접 생성하는 것입니다. 명백한 이유 때문에 어느 솔루션도 바람직하지 않습니다.
누구든지이 문제에 대한 간단한 해결책이 있습니까? 또는 함수 이름 오버로딩 문제를 일으키지 않는 더 나은 전체 디자인 아이디어일까요?
의견을 보내 주시면 감사하겠습니다.
'execute()'메소드는 실제 호출을합니다. 이 메소드는'name' 함수 인자 때문에'setName()'이라고 불립니다. 나는이 예에서 그것을 더 분명하게 고쳤다. 당신의 생각은 나쁜 것이 아닙니다. 매우 다른 인수 세트로 함수 이름이 오버로드되는 경우 문제점이 있지만 인수의 조합이 가능한지 알아내는 것은 혼란 스러울 수 있습니다. 그러나 편리한 방법으로, 실제로 작동 할 수도 있습니다! +1 런타임에서 정확한 호출을 결정하기위한 아이디어 –
@Lukas는 이름이 아닌 인수 형식과 일치한다는 것이 내 제안에 의한 것이 었습니다. 더 간단 할 것이라고 생각했습니다. 나는 어느 쪽이든 원칙적으로 가능할 것이라고 생각한다. –
인수 이름/유형/위치를 기반으로 함수를 호출하는 방법에 대한 좋은 구현을 쉽게 찾을 수 있습니다. 그러나 어려운 부분은 생성 된 코드를 개발자가 쉽게 사용할 수 있도록 만드는 것입니다. 그래서 생성 된 메소드에서 인수의 이름을 사용합니다. –