我在Postgres DBMS中创建了一个存储过程,并创建了一个调用该过程的Java函数。

运行Java函数后,我收到一个错误:

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)

这是过程代码:

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;

这是功能代码:

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;
        }
    }

#1楼 票数:2 已采纳

您应该与该函数的参数进行通信(实际上是其返回值),但是您将调用定义为:

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

您应该将其定义为:

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

否则,JDBC无法将第一个占位符注册为out参数-那里没有要注册的占位符。

#2楼 票数:2

Postgres函数就是:函数。 无需使用为真正的存储过程设计的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);

  ask by abdou amer translate from so

未解决问题?本站智能推荐:

2回复

PostgreSQL存储过程不起作用

我在Postgres DBMS中创建了一个存储过程,并创建了一个调用该过程的Java函数。 运行Java函数后,我收到一个错误: 这是过程代码: 这是功能代码:
1回复

从PostgreSQL调用存储过程

我正在尝试调用存储过程。 存储过程由数据库中的测试证明并执行 电话本身 由于修改了一条记录,因此按预期返回“ 1”,但是在数据库中(我通过pgAdmin查找)记录没有出现我在做什么错?
2回复

如何使用JDBC调用PostgreSQL存储过程

我正在使用postgresql,我已经创建了一些存储过程。 现在我想通过jdbc访问存储过程并处理结果。 存储过程的结果是整数或TABLE。 我找到了以下内容: 有了这个,我想我可以处理单个整数返回但是如何处理TABLE返回?
1回复

从JDBC调用的PostgresQL存储过程不起作用

我有一个带有一些表的Postgresql数据库和一个写在该表上的存储过程。 当我从psql调用此存储过程时,一切正常:我看到记录插入到表中。 虽然,当我通过JDBC调用此存储过程时,我得到了存储过程执行的日志,该序列增加了,但是我的表未更新。 这是我从全新的postgresql安装(9
1回复

使用SimpleJdbcCall和REF_CURSOR调用PostgreSQL存储过程

我想使用SimpleJDBCCall用REF_CURSOR调用PostgreSQL存储过程。 我的存储过程如下所示: 我尝试使用以下JAVA代码调用该过程: 运行代码我收到一条错误消息: 我使用Oracele存储过程以及REF_CURSOR测试了此代码。 我用来代替w
4回复

Java和PostgreSQL存储过程-返回注册为out参数,导致in参数出现问题

我正在尝试从Java应用程序调用PostgreSQL存储过程。 该过程具有DATE类型参数,因此我将Java.sql.Date类型与CallableStatement.setDate()一起使用。 但是,执行该语句始终会导致异常,并且SQL日志显示以下内容: 该存储过程实际上有6个参
1回复

PostgreSQL 9 JDBC驱动程序返回存储过程的错误元数据

我是一个开发商业智能(报告)工具的团队。 我们报告了许多来源,包括存储过程。 我们使用JDBC驱动程序提供的元数据来确定存储过程的输入和输出参数。 似乎PostgreSQL 9 JDBC驱动程序错误地返回过程参数的元数据。 例如,我的存储过程如下所示: 因此它有一个参数,
1回复

用Java调用存储过程

我正在为PostgreSQL使用JDBC驱动程序,我想调用存储过程。 假设我有一个调用存储过程的方法,如下所示: 现在,假设此方法callProcedure可能被调用百万次。 我的问题是: (1.)如果我在类的构造函数中创建连接,并在构造函数中也准备prepare_the_
3回复

从Java调用Postgres存储过程,表返回

我做了一个Postgres存储过程: 我试图像这样在Java中使用它: 要么 我想将结果存储在列表中。 因为遇到各种错误,我该怎么办以及应该怎么做? 更新: 这些是错误:
1回复

JDBC:检查存储过程的返回值

我的PostgreSQL数据库上有一个存储过程,该存储过程返回整数值。 当我使用CallableStatement调用过程形式的jdbc客户端程序时,当我对CallableStatement对象调用execute()方法时,它仅返回一个布尔值。 如何读取函数的有效返回值?