2015-01-14 4 views
0

Postgres DBMS 내에 저장 프로 시저와이 프로 시저를 호출하는 Java 함수를 만들었습니다. 여기 PostgreSQL 저장 프로 시저가 작동하지 않습니다.

CREATE OR REPLACE FUNCTION getlastfournisseurid(OUT lastid integer) 
    RETURNS integer AS 
$BODY$ 
begin 
     select last_value into lastid from fournisseur_fournisseurid_seq ; 
end; 
$BODY$ 
    LANGUAGE plpgsql; 

함수 코드입니다 : 여기
org.postgresql.util.PSQLException: L'indice de la colonne est hors limite : 1, nombre de colonnes : 0. 
    at org.postgresql.core.v3.SimpleParameterList.registerOutParameter(SimpleParameterList.java:49) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.registerOutParameter(AbstractJdbc2Statement.java:1968) 
    at org.postgresql.jdbc3.AbstractJdbc3Statement.registerOutParameter(AbstractJdbc3Statement.java:1511) 
    at DAO.FournisseurDAO.getLastId(FournisseurDAO.java:192) 
    at CONTROLLER.FournisseurController.getLastIdInDataBase(FournisseurController.java:96) 
    at VIEW.FournisseurUi.spinnerProperties(FournisseurUi.java:183) 
    at VIEW.FournisseurUi.componentsProperties(FournisseurUi.java:139) 
    at VIEW.FournisseurUi.<init>(FournisseurUi.java:100) 
    at VIEW.FournisseurUi$2.run(FournisseurUi.java:542) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744) 
    at java.awt.EventQueue.access$400(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:697) 
    at java.awt.EventQueue$3.run(EventQueue.java:691) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:714) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

프로 시저 코드 :

public int getLastId() { 
     String fournisseurLastId = "{ call getLastFournisseurId() }"; 
     int lastid = -1 ; 
     // Get Connection 
     Connection connecte = utility.DatabaseConnection.getInstance(); 

     try { 
      // Create a callableStatement 
      CallableStatement clblStmt = connecte.prepareCall(fournisseurLastId); 
      // Process query 
      clblStmt.registerOutParameter(1, java.sql.Types.INTEGER); 
      ResultSet result = clblStmt.executeQuery(); 
      result.next(); 
      lastid = clblStmt.getInt(1); 

      // close used resources    
      clblStmt.close(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
      return -1 ; 
     } finally { 
      try { 
       if (connecte != null) { 
        connecte.close(); 
       } 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 

      return lastid; 
     } 
    } 
+2

정확하게 오류가 발생 했습니까? – Todd

+0

질문에 오류가 추가되었습니다 –

+0

SQL 명령 인터페이스 (psql 또는 pgAdmin3 등)에서 내장 프로 시저를 직접 호출하여 작동하는지 확인해 보셨습니까? – RealSkeptic

답변

2

당신이 해야하는

자바 기능을 실행 한 후 나는 오류가 발생 해당 함수의 매개 변수 (사실, 반환 값)와 통신 할 수 있지만 다음과 같이 호출을 정의했습니다.

String fournisseurLastId = "{ call getLastFournisseurId() }"; 

대신로 정의한다 :

String fournisseurLastId = "{ ? = call getLastFournisseurId() }"; 

그렇지 않으면, JDBC는 out 매개 변수로 첫 번째 자리를 등록 할 수 없습니다 - 그것은 등록하는 거기에는 자리가 없다.

+0

'OUT' 매개 변수는 plpgsql 함수에 전달되어야하는 ***이 아닌 ***입니다. 대신 * 반환 *. –

+0

@ErwinBrandstetter Right. 구문을 변경했습니다. – RealSkeptic

+0

JDBC/Java 측에 대해서는 확신 할 수 없지만 Postgres 측이 수정되었습니다. 첫 번째 문장도 명확하게 할 수 있습니다. –

2

포스트 그레스 함수는 바로 그것입니다 : 함수. 실제 스토어드 프로 시저 용으로 설계된 JDBC CallableStatement을 사용할 필요가 없습니다.

귀하의 기능을 단순화 할 수도 있습니다. PL/pgSQL 함수는 필요 없습니다. 간단한 SQL 기능을 수행합니다

CREATE OR REPLACE FUNCTION getlastfournisseurid() 
    RETURNS integer AS 
$BODY$ 
    select lastvalue from fournisseur_fournisseurid_seq; 
$BODY$ 
    LANGUAGE sql; 

다음을 (이 테이블 fournisseur_fournisseurid_seq에서 결코 하나 개 이상의 행이있는 경우, 당신은 select 문에 limit 1를 추가 할 필요가 있다고 가정) 다음과 같이 지정하십시오.

Statement stmt = connecte.createStatement(); 
ResultSet rs = stmt.executeQuery("select getlastfournisseurid()"); 
rs.next(); 
lastid = rs.getInt(1); 
+0

이것은 허용 된 대답이어야합니다. –

관련 문제