JDBC/PLSQL: 如何获得匿名块的 return 值

JDBC/PLSQL: How can I get a return value of a anonymous block

我有一个匿名代码块。

String plsql = "DECLARE\n";
plsql += "\tret NUMBER;\n";
plsql += "\tretsum NUMBER := 0;\n";
plsql += "BEGIN\n";
plsql += "\tret := 1;\n";
plsql += "\tretsum := ret + retsum;\n";
plsql += "END;\n";

我用JDBC来称呼它。

CallableStatement cs = con.prepareCall (plsql);
boolean ret = cs.execute ();
cs.close ();

所有如果到目前为止工作。

如何让我的匿名块 return 成为我的 Java 代码中的一个值(例如 retsum)?

我知道存储函数并在那里处理 return - 但我不能在这里这样做。

CallableStatement cst = con.prepareCall ("{? = call foo ();}");
cst.registerOutParameter (1, Types.INTEGER);
cst.execute ();
int ret = cst.getInt (1);

在匿名块中使用绑定变量(?,用于匿名变量,或 :something,用于命名变量):

String plsql = "DECLARE
  ret NUMBER;
  retsum NUMBER := 0;
BEGIN
  ret := 1;
  retsum := ret + retsum;
  ? := retsum;
END;";

CallableStatement cst = con.prepareCall (plsql);
cst.registerOutParameter (1, Types.INTEGER);
cst.execute ();
int ret = cst.getInt (1);

自 Oracle 12c 以来可用的另一种可能方法是声明内联函数并使用通用 select 语句:

with function f
return number
as
  ret NUMBER;
  retsum NUMBER := 0;
BEGIN
  ret := 1;
  retsum := ret + retsum;
  return retsum;
END;

select f() as res
from dual
| RES |
| --: |
|   1 |

db<>fiddle here