2010-02-17 3 views
1

Java 응용 프로그램에서 PostgreSQL 저장 프로 시저를 호출하려고합니다. 프로 시저에는 DATE 유형 매개 변수가 있으므로 CallableStatement.setDate()에 java.sql.Date 유형을 사용하고 있습니다. 그러나, 항상 문을 실행하면 예외를 초래하고 SQL 로그는이 보여Java 및 PostgreSQL 저장 프로 시저 - 매개 변수에 문제가 발생하여 out 매개 변수로 등록 반환

LOG: execute <unnamed>: select * from athlete.create_athlete($1,$2,$3,$4,$5,$6,$7) as result 
DETAIL: parameters: $1 = '', $2 = '[email protected]', $3 = 'Joe', $4 = 'Blow', $5 = 'foobar', $6 = 'M', $7 = '1979-03-22 -04:00:00' 
ERROR: column "dob" is of type date but expression is of type text at character 122 
HINT: You will need to rewrite or cast the expression. 
QUERY: INSERT INTO athlete.athlete (email, first_name, last_name, password, gender, dob) VALUES ($1 , $2 , $3 , $4 , $5 , $6) 
CONTEXT: PL/pgSQL function "create_athlete" line 2 at SQL statement 
STATEMENT: select * from athlete.create_athlete($1,$2,$3,$4,$5,$6,$7) as result 

저장 프로 시저 실제로 6 개 매개 변수가 있습니다 (그리고 위의 값을 $부터 2 $ 7 받아야한다) - 제 7 회는 반환 값을 등록에서 온다 out 매개 변수로 사용합니다. 이것은 나 혼란 스럽다 - 반환 값에 대한 out 매개 변수를 등록 할 때 7 개의 매개 변수로 나타나는 것이 맞습니까? 내가 반환 값은 첫 번째 매개 변수로 등록하는 인상을 해요 읽은 모든 문서에서

는 :

registerQuery = "{? = call athlete.create_athlete(?,?,?,?,?,?)}"; 
... 
CallableStatement cs = conn.prepareCall(registerQuery); 
cs.registerOutParameter(1, Types.BOOLEAN); 
cs.setString(2, email); 
... 

오류는 위의 저장 사이에 불일치가 있다는 것을 나에게 제안 프로 시저 매개 변수 및 insert 문에 제공된 매개 변수 나는이 모든 것을 문서화했지만 분명히 잘못된 것을하고있다. 저장 프로 시저에 적절한 매개 변수를 제공하고 호출 후에 반환 값을 검색하려면 어떻게합니까?

답변

0

저장 프로 시저에 전달 된 매개 변수 순서가 해당 매개 변수가 삽입 문에 전달 된 순서와 일치하지 않는 것이 문제가되었습니다. 주문이 중요하다면 PostgreSQL이 명명 된 매개 변수를 사용하는 이유를 알지 못합니다.다음과 같이

예를 들어, 저장 프로 시저의 서명했다 :

INSERT INTO Person (name, bdate, gender) VALUES (in_name, in_bdate, in_gender);

가 순서 변경 다음과 같이

CREATE FUNCTION insert_Person (IN in_name TEXT, IN in_gender CHAR(1), IN in_bdate DATE) RETURNS BOOLEAN...

이 저장 프로 시저에 포함 된 INSERT 문이었다 저장 프로 시저 시그니처 또는 삽입 문에서 일치하는 매개 변수 (예 : 이전 매개 변수)를 사용하여 문제를 해결했습니다.

4

저장 프로 시저 유형 (기능/절차)의 서명에 따라 다릅니다.

아래와 같은 기능의 경우 out 매개 변수는 첫 번째 매개 변수이며 두 번째 및 세 번째 매개 변수로 param1 및 param2를 갖습니다. (기능)

DB 절차 : (기능)

CREATE FUNCTION my_func (
param1 INT, 
param2 INT) 
    RETURNS INT 
AS 
    : 
    : 

자바 코드 :

registerQuery = "{? = call my_func(?,?)}"; 
... 
CallableStatement cs = conn.prepareCall(registerQuery); 
cs.registerOutParameter(1, Types.INTEGER); 
cs.setInteger(2, 10); 
cs.setInteger(3, 10); 
... 

.

그러나 아래의 절차처럼 out 매개 변수는 세 번째 매개 변수이며 첫 번째 및 두 번째 매개 변수로 param1 및 param2를 갖습니다. (절차)

DB 절차 : (절차)

CREATE PROCEDURE my_proc (
param1 INT, 
param2 INT, 
OUT param3 INT) 
BEGIN 
    : 
    : 
END; 

자바 코드 :

registerQuery = "{call my_func(?,?,?)}"; 
... 
CallableStatement cs = conn.prepareCall(registerQuery); 
cs.registerOutParameter(3, Types.INTEGER); 
cs.setInteger(1, 10); 
cs.setInteger(2, 10); 
... 

.

반환 값이 하나 뿐인 동안 여러 개의 매개 변수를 가질 수 있습니다.

+0

전 저장 프로 시저 서명을 사용하고 있습니다. 문제가 아닌 것으로 판단됩니다. Date (날짜) 매개 변수를 전달하면 Date 열에 삽입하는 삽입을 위해 캐스팅해야합니다. – Matt

+0

저장된 proc의 서명으로 질문을 업데이트 할 수 있습니까? –

1

PostgreSQL 서버는 명명 된 매개 변수를 지원하지만 jdbc 드라이버는이 매개 변수를 지원하지 않습니다 (아직 알지 못합니다). 그런 경우에만 위치 매개 변수 만 지원됩니다.

0

OCI 계층의 제한으로 인해 JDBC 드라이버는 BOOLEAN 매개 변수를 PL/SQL 저장 프로 시저로 전달하는 것을 지원하지 않습니다. PL/SQL 프로 시저에 BOOLEAN 값이 포함되어있는 경우 인수를 INT로 허용하는 두 번째 PL/SQL 프로 시저로 PL/SQL 프로 시저를 래핑하고 첫 번째 저장 프로 시저로 전달함으로써 제한을 피할 수 있습니다. 두 번째 프로 시저가 호출되면 서버는 INT에서 BOOLEAN으로 변환을 수행합니다.

관련 문제