Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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
接收java.sql.SQLException:调用数据库函数时出现无效列索引错误_Java_Sql_Function - Fatal编程技术网

接收java.sql.SQLException:调用数据库函数时出现无效列索引错误

接收java.sql.SQLException:调用数据库函数时出现无效列索引错误,java,sql,function,Java,Sql,Function,我正在尝试使用callable语句调用数据库函数。存储过程的签名如下所示 function DUMMY_FUNCTION (PARAM1 in Number ,PARAM2 in Number ,PARAM3 in varchar2 ,PARAM4 i

我正在尝试使用callable语句调用数据库函数。存储过程的签名如下所示

 function DUMMY_FUNCTION (PARAM1          in    Number
                               ,PARAM2    in    Number
                               ,PARAM3 in    varchar2
                               ,PARAM4          in    Number
                               ,PARAM5           in    Date
                               ,PARAM6          in    Number 
                               ,PARAM7         out    varchar2
                               ,PARAM8           out    varchar2) 
返回varchar2

调用的JAVA代码如下:

//加载SQl二进制文件
导入java.sql.CallableStatement;
导入java.sql.Connection;
导入java.sql.Date;
导入java.sql.DriverManager;
导入java.text.simpleDataFormat;
公共类调用过程{
公共静态字符串调用过程(int-PARAM1、int-PARAM2、String-PARAM3、int-PARAM4、String-PARAM5、int-PARAM6)引发异常{
//定义参数
字符串结果=新字符串();
连接conn=null;
CallableStatement cs=null;
字符串outParam=null;
SimpleDataFormat sdf=新SimpleDataFormat(“yyyy-MM-dd”);
试一试{
conn=getDBConnection();
字符串函数=
“{?=调用P1SCHEMA.DUMMY_包.DUMMY_函数(?,,,,,,,?)}”;
连接设置自动提交(错误);
cs=连接准备呼叫(proc3Function);
java.sql.Date param5date=new java.sql.Date(sdf.parse(PARAM5.getTime());
//定义输入参数
cs.setInt(1,参数1);
cs.setInt(2,参数2);
cs.设置管柱(3,参数3);
cs.setInt(4,参数4);
cs.设置日期(5,param5date);
cs.setInt(6,PARAM6);
//定义输出参数
registerOutParameter(7,java.sql.Types.VARCHAR);
registerOutParameter(8,java.sql.Types.VARCHAR);
registerOutParameter(9,java.sql.Types.VARCHAR);
//执行语句
cs.execute();
//捕获输出
outParam=cs.getString(8);
字符串I=新字符串(输出参数);
//集合结果数组
结果=I.toString()+“####”+cs.getString(7)+“###”+cs.getString(8)+“###”+cs.getString(9);
//检查从存储过程返回的原因码
如果(输出参数==“S”)
{
//回滚事务
连接回滚();
}
其他的
{
//提交事务
conn.commit();
}
} 
捕获(例外e)
{
e、 printStackTrace();
}
最后
{
如果(cs!=null)
{
//密切联系
cs.close();
}
如果(conn!=null)
{
//密切联系
康涅狄格州关闭();
}
}
//将数组返回到客户端
返回结果;
}
公共静态连接getDBConnection()引发异常{
String driver=“oracle.jdbc.xa.client.oraclexadasource”;
String url=“jdbc:oracle:thin:@localhost:1539:DEV”;
字符串username=“user”;
字符串password=“password”;
Class.forName(驱动程序);
Connection conn=DriverManager.getConnection(url、用户名、密码);
返回连接;
}
公共静态void main(字符串args[])引发异常{
InvokeProcedure INP=新的InvokeProcedure();
字符串Args=INP.callProcedure(1,2,“A”,3,“2016-01-23”,4);
系统输出打印项次(Args);
}

}
很抱歉,由于它不在代码段中,因此错过了它。我想您需要首先注册输出参数,因为您有语句“?=…”因此它将是cs.registerOutParameter(1,java.sql.Types.VARCHAR);然后是没有最后一个参数的其他参数,当然是Stan的

函数有8个参数,但调用只有6个
(?,?,?,?,,?,?)

使用:

然后-位置参数从左到右编号。

  • {?=
    -这是第一个参数,它的索引是1,
    使用
    cs.registerOutParameter(1,java.sql.Types.SomeType)
  • (?,?,,,,,,,,,,?)
    连续有2,3,4,…8,9个参数
使用:

索引为8,9的最后两个参数为OUT参数-使用以下方法注册它们:

cs.registerOutParameter(8, java.sql.Types.VARCHAR);
cs.registerOutParameter(9, java.sql.Types.VARCHAR);

看起来你的函数只有2个out参数,但是你正在注册3Hi Stan,我在最后还有返回varchar2,在构建模式时,我得到了三个参数。很抱歉,由于它在代码段之外,所以错过了它。我想你需要先注册输出参数,因为你有语句“?=…”,所以它将是cs.registerOutParameter(1,java.sql.Types.VARCHAR);然后是没有最后一个参数的其他参数谢谢..愚蠢的错误:)谢谢
"{? = call P1SCHEMA.DUMMY_PACKAGE.DUMMY_FUNCTION(?, ?, ?, ?, ?, ?, ?, ?) }";
cs.setInt(2, PARAM1);
cs.setInt(3, PARAM2);
cs.setString(4, PARAM3);
...
cs.registerOutParameter(8, java.sql.Types.VARCHAR);
cs.registerOutParameter(9, java.sql.Types.VARCHAR);