繁体   English   中英

PostgreSQL存储过程不起作用

PostgreSQL stored procedure not working

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在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;
        }
    }
2 个回复

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

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

您应该将其定义为:

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

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

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);
1 从JDBC调用的PostgresQL存储过程不起作用

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

2 访问存储过程不起作用

以下存储过程无法正常工作,我尝试了所有尝试,但均未成功。 请帮助。 当我运行它时,出现以下错误消息: 运行时错误'-2147217900(80040e14)':FROM子句中的语法错误。 我找不到问题。 ...

3 存储过程的结果不起作用

我正在使用EF4.0,并且定义了一个函数导入,以向我返回一个以存储过程为模型的复杂类型。 我可以很好地执行存储的proc并正确返回我的结果以及除1以外的所有过滤器工作。 调试器中filter.LandId的值为“ HO \\\\ UserX”,但是Text Visualizer告诉我实 ...

5 SQl存储过程不起作用

我有一个无法正常运行的存储过程: 我认为以下几行正在发挥作用。 这是正确的语法吗? 问候, 鲍勃 ...

2014-08-25 08:19:32 2 32   mysql/ sql
6 条件不起作用的存储过程

这是我从表中选择数据的存储过程。 但是如果我把条件放在其中。 然后抛出一个错误 “'='附近的语法不正确。” 但是,如果我删除条件,那么此查询将正常工作。 谁能告诉我在哪里情况下我做错了什么。 ...

8 存储过程+呼叫不起作用

但是,我的存储过程会编译。 当我尝试调用它时,出现以下错误: 我的存储过程如下: 我如何称呼它(以及返回上面列出的错误的原因)如下: 提前致谢! ...

10 MySQL存储过程-如果不起作用

我正在将SQL Server存储过程转换为MySQL并遇到问题。 我有一个带有IF THEN ELSE的存储过程,该存储过程虽然没有给出错误,但也没有返回任何数据,并且也没有解决该问题的方法。 这些查询本身是正确的并返回数据,但似乎在存储过程中不起作用。 这是FYI的真实查询的简化版本。 ...

2017-10-08 17:11:35 1 29   mysql
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM