位置 5 处的 SQL92 字符串格式错误。需要“call”吗?

Sau*_*rav 2 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");
         cstmt.setString(3,l_srccur);
         cstmt.setString(4, l_tfcurr);
         cstmt.setString(5, "B001");

         cstmt.execute();
         res = cstmt.getString(1);
Run Code Online (Sandbox Code Playgroud)

Oracle Function

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;
Run Code Online (Sandbox Code Playgroud)

kfi*_*ity 6

您有多种选择:

A) 您正在使用 SQL92 语法(带有大括号 {})。我认为对于这个选项,“call”需要小写。

CallableStatement cstmt = p_con.prepareCall("{? = call FXRATE_ENTITY(?, ?, ?, ?)}")
Run Code Online (Sandbox Code Playgroud)

B) Oracle SQL 语句CALL 可以用于函数,但需要INTO子句。由于 OUT 参数现在位于末尾,因此请重新排序参数语句。

CallableStatement cstmt = p_con.prepareCall("CALL FXRATE_ENTITY(?, ?, ?, ?) INTO ?");
cstmt.setString(1, "SCR");
cstmt.setString(2,l_srccur);
cstmt.setString(3, l_tfcurr);
cstmt.setString(4, "B001");
cstmt.registerOutParameter(5, java.sql.Types.INTEGER);
Run Code Online (Sandbox Code Playgroud)

B) 您可以使用 PL/SQL 匿名块代替 CALL,如下例所示

CallableStatement cstmt = p_con.prepareCall("begin ? := FXRATE_ENTITY(?, ?, ?, ?); end;");
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");
Run Code Online (Sandbox Code Playgroud)