Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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中的Oracle函数_Java_Oracle_Jdbc - Fatal编程技术网

Java中的Oracle函数

Java中的Oracle函数,java,oracle,jdbc,Java,Oracle,Jdbc,我试图从Java代码中调用Oracle函数,如下所示: Java CallableStatement cstmt = p_con.prepareCall("{? = CALL FXRATE_ENTITY(?, ?, ?, ?, ?)}"); cstmt.registerOutParameter(1, java.sql.Types.INTEGER); cstmt.setString(2, "SCR");

我试图从Java代码中调用Oracle函数,如下所示:

Java

CallableStatement cstmt = p_con.prepareCall("{? = CALL FXRATE_ENTITY(?, ?, ?, ?, ?)}");
         cstmt.registerOutParameter(1, java.sql.Types.INTEGER);

         cstmt.setString(2, "SCR");
         cstmt.setString(3,l_srccur);
         cstmt.setString(4, l_tfcurr);
         cstmt.setString(5, "B001");

         cstmt.execute();
       String res = cstmt.getString(1);
但我有个例外

java.sql.SQLException:索引::6处缺少IN或OUT参数

我不确定我做错了什么。这也是我试图调用的函数

Oracle功能

FUNCTION FXRATE_ENTITY(CODCURRBASE IN VARCHAR, LCODCURRFROM IN VARCHAR, LCODCURRTO IN VARCHAR, LIDENTITY IN VARCHAR)
  RETURN NUMBER IS
  CODCUR_L VARCHAR2(3);
BEGIN
  IF (LCODCURRTO = '*') THEN
    RETURN NVL(FXRATE(CODCURRBASE, LCODCURRFROM, CODCURRBASE, LIDENTITY),
               0);
  ELSE
    RETURN NVL(FXRATE(CODCURRBASE, LCODCURRFROM, LCODCURRTO, LIDENTITY), 0);
  END IF;
END;

如有任何帮助或建议,将不胜感激。提前感谢。

您在prepare call语句中有一个额外的
,它不是必需的,因为第一个参数被视为返回参数,因此我们需要使用
registerOutParameter
注册out参数

将语句更改为下面,它应该会起作用

CallableStatement cstmt = p_con.prepareCall("{? = CALL FXRATE_ENTITY(?, ?, ?, ?)}");

我很确定准备好的语句不支持任何特定于数据库的sql函数/关键字。您可能需要对这些内容使用本机查询。好的,我删除了额外的
,但现在我在位置5处得到了格式不正确的SQL92字符串。期待“call”
作为例外。它是独立函数还是包函数?我不确定,但我认为它是一个包函数…我已经复制了确切的场景,它对我有效。你能更新代码吗?还提到了
l_srccur
l_tfcurr
的赋值。最后,您在数据库中看到的函数是否以创建或替换开始?因为在包内调用函数是不同的。
l_srccur
l_tfcurr
属于
String
类型。不,它不是以
create或replace
开头,而是在包名
Function
中,其中还有其他函数。。。