JDBC - 从 JAVA 调用 PLSQL 给出 Java.sql.SQLException: ORA-06550

Posted

技术标签:

【中文标题】JDBC - 从 JAVA 调用 PLSQL 给出 Java.sql.SQLException: ORA-06550【英文标题】:JDBC - Calling PLSQL from JAVA gives Java.sql.SQLException: ORA-06550 【发布时间】:2018-10-26 16:53:41 【问题描述】:

我在从 Java 调用 PLSQL 时遇到了很大的麻烦。 这是我的代码:

static final String PLSQL = "call DBK_PDG_METADATI_CEDOLINO.dbp_main(?,?,?,?,?,?,?,?,?)";

Connection conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
CallableStatement cs = conn.prepareCall(PLSQL);

    for (Cedolino item : items) 
        LOG.info("################# ELABORAZIONE CEDOLINO " + item.getTestata().getAnagrafica().getCodFiscaleAmministrato() + " #################");
        cedolini.getCedolino().add(item);
        setParametersForPlSql(cs, item);

        try
            cs.execute();
        catch(SQLException e)
            LOG.info(e.toString());
        

    

cs.close();
conn.close();

private void setParametersForPlSql(CallableStatement cs, Cedolino ced)

    try 
        cs.setInt("tipo_lancio", 1);
        cs.setString("iscr", ced.getTestata().getTrattamento().getIscrizione().trim());
        cs.setString("rts", ced.getTestata().getDpt().trim());
        cs.setString("codfisc", ced.getTestata().getAnagrafica().getCodFiscaleAmministrato().trim());
        cs.setString("lingua", this.lingua);
        cs.setString("file_name", null);
        cs.setString("dir_spec", null);
        cs.setString("stato_elab", "S");
        cs.setString("descr_elab", null);


     catch (SQLException e) 
        e.printStackTrace();
    


除了cs.execute,这段代码运行良好,这给了我这个错误

java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'DBP_MAIN'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我检查了一千次,参数和类型和数字完全匹配。数据库连接也很好,因为我先做了一些缓存,它可以工作。

已经尝试删除DBK_PDG_METADATI_CEDOLINO,但没有任何必要。 你能帮我弄清楚吗?

【问题讨论】:

如果您使用位置占位符 (?),您应该使用基于索引的设置器(尽管我不能 100% 确定 Oracle 在这种情况下是否允许以任何方式命名)。 【参考方案1】:
    问题可能与可能不支持命名参数的 JDBC 驱动程序有关。

尝试先检查一下:

  Connection myConn = . . .   // connection to the RDBMS for Database
  DatabaseMetaData dbmd = myConn.getMetaData();
  if (dbmd.supportsNamedParameters() == true)
  
      System.out.println("NAMED PARAMETERS FOR CALLABLE"
                        + "STATEMENTS IS SUPPORTED");
  

如果不是 - 使用参数索引而不是名称来设置...

    该存储过程中是否有任何 OUT 或 INOUT 参数?

如果是这样,您需要使用registerOutParameterCallableStatement 注册这些参数,并为输出提供一个占位符。

【讨论】:

抱歉回复晚了!我使用参数索引尝试了您的解决方案,并且......它有效!原因可能是首先我使用 ojbdc14 作为 jar 并且命名参数正常,然后降级到 ojdbc5 后不再存在。谢谢你!

以上是关于JDBC - 从 JAVA 调用 PLSQL 给出 Java.sql.SQLException: ORA-06550的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL 工具怎样调用存储过程咧?

从Oracle PLSQL调用java时如何将参数传递给java

如何从 jdbc 调用存储的函数?

Oracle Jdbc CallableStatement 失败,plsql 包含 CR ("\r")

从plsql调用java时Oracle如何导入缺少的java类

将数据从 PLSQL 程序推送到 Java 应用程序