Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JDBC-从JAVA调用PLSQL会得到JAVA.sql.SQLException:ORA-06550_Java_Oracle_Jdbc_Plsql - Fatal编程技术网

JDBC-从JAVA调用PLSQL会得到JAVA.sql.SQLException:ORA-06550

JDBC-从JAVA调用PLSQL会得到JAVA.sql.SQLException:ORA-06550,java,oracle,jdbc,plsql,Java,Oracle,Jdbc,Plsql,我在从Java调用PLSQL时遇到了巨大的麻烦。 这是我的密码: static final String PLSQL = "{call DBK_PDG_METADATI_CEDOLINO.dbp_main(?,?,?,?,?,?,?,?,?)}"; Connection conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource()); CallableStatement cs = conn.prepareCall(PLSQL

我在从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
我检查了一千次,参数、类型和数字完全匹配。DB连接也很好,因为我先做了一些缓存,它就工作了

已尝试删除
DBK\u PDG\u METADATI\u CEDOLINO
,但不需要它。 你能帮我弄清楚吗

  • 问题可能与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参数
  • 如果是这样,您需要使用
    CallableStatement
    registerOutParameter
    注册这些参数,并为输出提供占位符

  • 问题可能与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参数

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

    如果您使用位置占位符(
    ),您应该使用基于索引的设置器(尽管我不能100%确定Oracle是否允许以任何方式命名)。如果您使用位置占位符(
    ),您应该使用基于索引的设置器(尽管我不能100%确定Oracle是否允许在这种情况下使用任何命名方式)。很抱歉回答得太晚!我使用参数和索引尝试了您的解决方案。。它起作用了!原因可能是,首先我使用ojbdc14作为jar,命名参数还可以,然后在降级到ojdbc5之后就不再需要了。谢谢你,伙计!对不起,迟了回答!我使用参数和索引尝试了您的解决方案。。它起作用了!原因可能是,首先我使用ojbdc14作为jar,命名参数还可以,然后在降级到ojdbc5之后就不再需要了。谢谢你,伙计!